我有这个代码:
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
}
}
弹出窗口没有显示。我做了所有事情。
这是为什么?
您正在使用单一
show
状态来控制所有弹出窗口!无法同时显示多个弹出窗口,因此不会显示任何内容。从技术上讲,可以将 的类型更改
show
为 并将[Bool]
等传递给,$show[0]
但查找 的索引等会相当不方便。$show[1]
isPresented
tool
如果父视图不需要确切知道显示哪些弹出窗口,则应将按钮提取到单独的视图中,并将状态放在
show
那里。由于
@State
位于 中ToolButton
,因此 的状态数将与 一样多ToolButton
,这意味着每个弹出框由一个状态控制。