如何从另一个视图更新 UI 视图 [SwiftUI 问题]

How to update UI of a view from another view [ SwiftUI Question]

我是 Swift 和 iOS 开发人员的新手。

我正在 SwiftUI 中构建应用程序。假设不同文件中有 2 个单独的视图:MainView() & Results() 和 TabBar()(忽略命名,这只是一个示例)(这 2 个视图在 2 个单独的 TABS 上)

我的目标是按下 FROM ResultsView() 按钮并将 MainView() 的文本值 属性 更改为其他内容,然后在 MainView() 上显示更改。我怎样才能做到这一点? P.S 请忽略对齐等。我是 Whosebug 的新手

struct MainView: View {
    
    @State var textValue: String = "Old Text"
    
    var body: some View {
        Text(textValue)
    }
    
}

struct TabBar: View {
    var body: some View {
        TabView {
            MainView()
                .tabItem {
                    Label("Main", systemImage: "circle.dashed.inset.filled")
                }
            ResultsView()
                .tabItem {
                    Label("Results", systemImage: "person.2.crop.square.stack.fill")
                }
        }
    }
}

struct ResultsView: View {
    
    var body: some View {
        Button {
            // HOW TO UPDATE MainView.textValue?
        } label: {
            Text("Update")
        }
    }
}

基本上,我的问题是我们如何从另一个视图更改UI 某个视图?没有 NavigationLink

听起来像是一个菜鸟问题,但如有任何答复,我们将不胜感激!

您可以通过 @Binding.

textValue 从 MainView 传递到 DetailView 来实现此目的
struct MainView: View {
    @State private var text: String = "Original"

    var body: some View {
        NavigationView {
            VStack {
                Text(text)
                NavigationLink("Detail", destination: DetailView(text: $text))
            }
        }
    }
}

struct DetailView: View {
    @Binding var text: String
    
    var body: some View {
        Button("Change Text") {
            text = "New Text"
        }
    }
}

我建议您阅读 this article 关于绑定的内容,因为它解释了如何从其他地方更改视图。

编辑: 因为你提到,两个视图都在 TabBar 中,这里应该是一个工作示例:

struct ContentView: View {
    @State private var text: String = "Original Text"
    
    var body: some View {
        TabView {
            MainView(text: $text)
                .tabItem { ... }
            DetailView(text: $text)
                .tabItem { ... }
        }
    }
}

struct MainView: View {
    @Binding var text: String

    var body: some View {
        Text(text)
    }
}

struct DetailView: View {
    @Binding var text: String

    var body: some View {
        Button("Change Text") {
            text = "New Text"
        }
    }
}