Eu tenho este código:
import SwiftUI
struct ContentView: View {
@State var show = false
var tools = [Tool("document.on.document"), Tool("document.on.clipboard")]
var body: some View {
HStack{
HStack {
ForEach(tools, id:\.id) { tool in
Button(action: {
print("toggle")
show.toggle()
}, label: {
Image(systemName:tool.name)
.imageScale(.large)
.foregroundStyle(.black.gradient)
.font(.system(size: 30))
})
.contentShape(Rectangle())
.popover(isPresented: $show, arrowEdge: .top) {
Color.red
.frame(width:400, height:400)
.onAppear{
print("popover show")
}
}
}
}
.padding()
}
.background(
RoundedRectangle(cornerSize: CGSize(width: 50,height: 50))
.fill(.red.opacity(0.5).gradient))
.padding()
}
}
#Preview {
ContentView()
}
struct Tool: Identifiable, Equatable {
let id = UUID()
let name:String
init(_ name: String) {
self.name = name
}
}
o popover não aparece. Eu fiz tudo.
Por que é que?
Você está usando um único
show
estado para controlar todos os popovers! Vários popovers não podem ser mostrados ao mesmo tempo, portanto, as anotações são mostradas.É tecnicamente possível alterar o tipo de
show
to[Bool]
e pass$show[0]
,$show[1]
etc toisPresented
, mas seria bastante inconveniente encontrar o índice de thetool
e coisas assim.Se a visualização pai não precisar saber exatamente quais popovers são mostrados, você deverá extrair o botão em uma visualização separada e colocar o
show
estado lá.Como
@State
está emToolButton
, haverá tantos estados quantosToolButton
, o que significa um estado para controlar cada popover.