【问题标题】:First popover showing outdated state第一个显示过时状态的弹出窗口
【发布时间】:2021-05-23 04:18:15
【问题描述】:

我发现了一种符合我口味的 popover 奇怪行为。我希望它显示带有PopoverItemnumber 的视图,两者都将从onTapGesture 中的ForEach 设置。问题是弹出框总是在第一次点击时显示默认的number,它对每个其他都按预期工作。

错误(左)和正确的行为(第二次点击按预期工作)。在 iOS 上相同,与 Button 相同

我能够使其与 Binding 一起工作,但我想找到一个更好的解决方案来呈现弹出框,并找出它为什么不能按我预期的那样工作。

我的主视图如下所示:

struct PopoverTest: View {
    let array: [PopoverItem] = [PopoverItem("First title"), PopoverItem("second title"), PopoverItem("third title")]
    @State var show: PopoverItem? = nil
    @State var number: Int = 0
    var body: some View {
        VStack {
            ForEach(Array(array.enumerated()), id: \.element.id) { number, item in
                MyPopover(number: number + 1, item: item)
                    .onTapGesture {
                        self.number = number + 1
                        self.show = item
                    }
            }
        }
        .popover(item: $show) { item in
            MyPopover(number: number, item: item)
        }
    }
}

以及弹出框和项目:

struct MyPopover: View {
    let number: Int
    let item: PopoverItem
    var body: some View {
        HStack {
            Text("\(number)")
            Text(item.text)
        }.padding()
    }
}

struct PopoverItem: Identifiable {
    let id = UUID()
    let text: String
    
    init(_ text: String) { self.text = text }
}

【问题讨论】:

    标签: swift swiftui popover


    【解决方案1】:

    inside弹出框的信息仅通过item传递,即在

    .popover(item: $show) { item in
        MyPopover(number: number, item: item) // << number in only at init !!
    }
    

    所以这种情况对popover无效

    .onTapGesture {
        self.number = number + 1 // << changed only in state !!
        self.show = item        // passed in popover
    }
    

    因此,如果您在 MyPopover 中需要 number,则必须通过 item 为它引入 PopoverItem 中的新属性来传递它。

    【讨论】:

    • 我也是这么想的,但后来——当你点击第一个标题(不起作用),然后是第二个(它起作用),然后又是第一个(它起作用)。为什么每次都有效,但不是第一次?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多