swift 嵌套视图中的弹出视图

hgc7kmma  于 2022-12-26  发布在  Swift
关注(0)|答案(1)|浏览(153)

我有一个视图中的视图中的视图中的视图。我试图在嵌套最深的视图中创建一个弹出视图,使其后面的整个屏幕变暗,但它只使嵌套视图的边界变暗,这是有意义的。但是,我如何覆盖这个设置?
下面是触发弹出窗口的条件子句:

if isSelect {
    GeometryReader { _ in
        SelectView()
            .frame(maxWidth: .infinity, maxHeight: .infinity)
            .padding(.horizontal, 35)
    }
    .background(
        Color.black.opacity(0.65)
            .edgesIgnoringSafeArea(.all)
            .onTapGesture {
                withAnimation {
                    self.isSelect.toggle()
                }
            }
    )
} // end overlay
z0qdvdin

z0qdvdin1#

为了确保我完全理解这一点,您实际上有一堆嵌套的视图,并且您希望使最低级别的视图的背景变暗。换句话说,触发背景变暗的视图一直位于层次结构的底部,而上面的视图应该变暗。
最简单的方法是将isSelect通过父视图向下传递到子视图并在那里处理它。它是通过引用传递的,所以对它的任何更改都会导致它在视图层次结构中向上传递。

//Some View 
var body: some View {
    @Binding var value: Bool = false

    VStack{
        ViewA(someValue: $valueA)
    }.opacity(someValue ? 0 : 1)
}

//Child View aka ViewA
@Binding var someValue: Bool

var body: some View {
    Button(action: { someValue.toggle() }, label: { Text("Some Button")
}

注意,在第一个视图中,我们创建了一个值,我们想观察它的变化,所以它被设置为一个Binding,当它的状态改变时,视图将被重绘;第二个视图从第一个视图中获取对value的引用,所以它没有被重新创建,而是仅仅查看内存指针,以确定它是同一个对象。
这里使用的概念称为Passing By Reference,而另一种类型的概念称为Passing By Value,两者的工作方式完全不同。

相关问题