Ios 将.popover附加到列表中的ForEach或节会创建多个popover

Ios 将.popover附加到列表中的ForEach或节会创建多个popover,ios,swiftui,Ios,Swiftui,我有一个包含多个部分的列表,每个部分都有不同类型的数据。对于每个部分,我希望单击一个项目以显示一个弹出窗口 问题是,如果我将.popover附加到部分或ForEach中,则.popover似乎应用于列表中的每个条目。因此,即使只单击一个项目,也会为每个项目创建popover 下面是示例代码。我无法将.popover附加到列表,因为在我的例子中,有两种不同样式的.popover并且每个视图只能附加一个.popover struct Item: Identifiable { var id =

我有一个包含多个
部分的
列表
,每个部分都有不同类型的数据。对于每个部分,我希望单击一个项目以显示一个弹出窗口

问题是,如果我将
.popover
附加到
部分或
ForEach
中,则
.popover
似乎应用于列表中的每个条目。因此,即使只单击一个项目,也会为每个项目创建popover

下面是示例代码。我无法将
.popover
附加到
列表
,因为在我的例子中,有两种不同样式的
.popover
并且每个视图只能附加一个
.popover

struct Item: Identifiable {
    var id = UUID()
    var title: String
}

var items: [Item] = [
    Item(title: "Item 1"),
    Item(title: "Item 2"),
    Item(title: "Item 3"),
]

struct PopoverView: View {
    @State var item: Item
    
    var body: some View {
        print("new PopoverView")
        return Text("View for \(item.title)")
    }
}

struct ContentView: View {
    @State var currentItem: Item?
    
    var body: some View {
        List {
            Section(header: Text("Items")) {
                ForEach(items) { item in
                    Button(action: { currentItem = item }) {
                        Text("\(item.title)")
                    }
                }
            }
        }
    }
}
我目前提出的最佳解决方案是将popover连接到每个
按钮
,然后基于
当前项
只允许一个popover

                    Button(action: { currentItem = item }) {
                        Text("\(item.title)")
                    }
                    .popover(isPresented: .init(get: { currentItem == item },
                                                set: { $0 ? (currentItem = item) : (currentItem = nil) })) {
                        PopoverView(item: item)
                    }
有更好的方法吗


解决这个问题的好处是:当我使用我的hack时,向下拖动的动作似乎出现了故障,视图再次从顶部出现。不确定处理的是什么。

试图接触到
ForEach中的
sheet
popover
等组件会导致问题。 我也遇到了你提到的小故障,但下面(附表)的工作与预期相符

列表{
章节(标题:文本(“项目”)){
ForEach(items){item in
按钮(操作:{currentItem=item}){
文本(“\(item.title)”)
}
}
}
}
.sheet(项:$currentItem,内容:PopoverView.init)

试图接触到
ForEach
中的
sheet
popover
等组件会导致问题。 我也遇到了你提到的小故障,但下面(附表)的工作与预期相符

列表{
章节(标题:文本(“项目”)){
ForEach(items){item in
按钮(操作:{currentItem=item}){
文本(“\(item.title)”)
}
}
}
}
.sheet(项:$currentItem,内容:PopoverView.init)

您始终可以为项目创建单独的视图

struct MyGreatItemView: View {
    @State var isPresented = false
    var item: Item
   
    var body: some View {

          Button(action: { isPresented = true }) {
                        Text("\(item.title)")
                    }
           .popover(isPresented: $isPresented) {
                        PopoverView(item: item)
                    }

    }
}
并将其实现到ContentView:

struct ContentView: View {  
    var body: some View {
        List {
            Section(header: Text("Items")) {
                ForEach(items) { item in
                   MyGreatItemView(item: item)
                }
            }
        }
    }
}

始终可以为项目创建单独的视图

struct MyGreatItemView: View {
    @State var isPresented = false
    var item: Item
   
    var body: some View {

          Button(action: { isPresented = true }) {
                        Text("\(item.title)")
                    }
           .popover(isPresented: $isPresented) {
                        PopoverView(item: item)
                    }

    }
}
并将其实现到ContentView:

struct ContentView: View {  
    var body: some View {
        List {
            Section(header: Text("Items")) {
                ForEach(items) { item in
                   MyGreatItemView(item: item)
                }
            }
        }
    }
}

我认为这仍然受到以下事实的影响:一个特定视图只能附加一个
.sheet
。另外,将
.sheet
附加到更高级别的对象时出现问题,更改了
按钮
视图的显示。这是出乎意料的。我认为这仍然受到以下事实的影响:一个特定视图只能附加一个
.sheet
。另外,将
.sheet
附加到更高级别的对象时出现问题,更改了
按钮
视图的显示。这是出乎意料的。