SwiftUI-基于ObservedObject的条件在后续视图中不起作用

时间:2020-05-29 19:29:39

标签: swift swiftui

我有一个非常简单的应用程序,其中包含两个用NavigationLink捆绑在一起的视图。在第一个视图ContentView中,我可以按预期看到对ObservedObject的更新。但是,当我转到下一个View时,似乎基于ObservedObject的代码无法识别更改。

ContentView.swift(工作视图):

import SwiftUI

struct ContentView: View {
    @ObservedObject var toggleObject = ToggleObject()

    var body: some View {
        NavigationView {
            VStack(spacing: 15) {
                Toggle(isOn: self.$toggleObject.isToggled) {
                    Text("Toggle:")
                }

                if self.toggleObject.isToggled == true {
                    Text("ON")
                }
                else {
                    Text("OFF")
                }

                NavigationLink(destination: ShowToggleView()) {
                    Text("Show Toggle Status")
                }
            }
        }
    }
}

ShowToggleView.swift(该视图的行为不符合我的预期):

import SwiftUI

struct ShowToggleView: View {
    @ObservedObject var toggleObject = ToggleObject()

    var body: some View {
        Form {
            Section {
                if self.toggleObject.isToggled {
                    Text("Toggled on")
                }
                else {
                    Text("Toggled off")
                }
            }
        }
    }
}

所有这些数据都存储在一个简单的文件ToggleObject.swift中:

import SwiftUI

class ToggleObject: ObservableObject {
    @Published var isToggled = false
}

当我在第一个View中打开它时,会看到预期的文本“ ON”,但是当我进入下一个视图时,无论我在第一个{ {1}} ...为什么?

使用Xcode 11.5和Swift 5

1 个答案:

答案 0 :(得分:1)

您几乎在做所有正确的事情。但是,您正在第二个视图中创建ToggleObject()的另一个实例,该实例将覆盖数据。您基本上只创建一个ObservedObject,然后将其传递到子视图,这样它们都可以访问相同的数据。

将其更改为此:

struct ShowToggleView: View {
    @ObservedObject var toggleObject : ToggleObject

然后在导航链接中将对象传递到该视图...

NavigationLink(destination: ShowToggleView(toggleObject: self.toggleObject)) {
    Text("Show Toggle Status")
}