在 SwiftUI 中的 2 个子视图之间共享 @State var Bool

Ale*_*nnd 0 xcode swift swiftui

我是一名设计师,我尝试学习 SwiftUI 是为了好玩,也是为了确保我更多地了解我的开发团队需要我做什么。

有一些非常简单的事情我就是做不到!

正如您从下面的这段代码中看到的,我只想在 var showHello 为 true 时显示文本,并且它工作得很好。

import SwiftUI

struct ContentView: View {

    @State var showHello = true

    var body: some View {

        VStack {
            Spacer()
            Button("Show Hello", action: { showHello.toggle() })
                .padding()
            Spacer()
            Text("This is your message:")
                .padding()
            if showHello == true {
                Text("Hello")
            } else {
                Text("Hello")
                    .opacity(0)
            }
            Spacer()
        }

    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我想通过使用多个视图做完全相同的事情时,它不起作用!

// Parent file

import SwiftUI

struct ContentView: View {

    var body: some View {

        VStack {
            TopView()
            BottomView()
        }

    }

}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}
Run Code Online (Sandbox Code Playgroud)
// Child file 1

import SwiftUI

struct TopView: View {

    @State var showHello = true

    var body: some View {

        Button("Show Hello", action: { showHello.toggle() })
            .padding()

    }

}

struct TopView_Previews: PreviewProvider {
    static var previews: some View {
        TopView()
    }
}
Run Code Online (Sandbox Code Playgroud)
// Child file 2

import SwiftUI

struct BottomView: View {

    var body: some View {

        Text("This is your message:")
        if showHello == true {
            Text("Hello")
        } else {
            Text("Hello")
                .opacity(0)
        }

    }

}

struct BottomView_Previews: PreviewProvider {
    static var previews: some View {
        BottomView()
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道我们不能共享来自不同视图的 var,因此我花了几个小时在互联网上了解有关使用 @State/@Binding 或 @EnvironmentObject 的更多信息,但所有示例都是关于从父视图向子视图共享 var视图,但不能在子视图之间进入父视图。

另外,无论我在做什么,Xcode 总是会出现错误,因为某处缺少某些东西!

我需要您的帮助,提前致谢!:P

Nic*_*apu 6

我在互联网上花了几个小时来了解有关使用 @State/@Binding 或 @EnvironmentObject 的更多信息

所以你走在正确的道路上,因为你确实需要使用@Binding. 也许您只是对如何连接这些点有错误的想法。

基本上,您需要@State在父视图中使用属性包装器,或者ContentView由于您希望在子视图中共享相同的属性并对它的任何突变做出反应,因此您可以@Binding在子视图中使用属性包装器。

所以你会得到这样的东西:

struct ContentView: View {
    @State var showHello = true

    var body: some View {
        VStack {
            TopView(showHello: $showHello)
            BottomView(showHello: showHello)
        }
    }
}

struct TopView: View {
    @Binding var showHello: Bool

    var body: some View {
        Button("Show Hello", action: { showHello.toggle() })
            .padding()
    }
}

struct BottomView: View {
    let showHello: Bool

    var body: some View {
        Text("This is your message:")
        Text("Hello")
            .opacity(showHello ? 1 : 0)
        }
    
}
Run Code Online (Sandbox Code Playgroud)

我会推荐一些其他关于 SwiftUI 的好资源: