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
附加到更高级别的对象时出现问题,更改了按钮
视图的显示。这是出乎意料的。