class - SwiftUI @Published 和 @ObservedObject 不会到达 NavigationLink 目的地

标签 class swiftui observable swiftui-navigationlink observedobject

抱歉,我很难概括标题和长度

我有一个 @ObserableObject @Published 数据类,我想更改它并在通过 NavigationLink 访问的第二页上使用新数据

class Data: ObservableObject {
     @Published var number = 5

          var correctNumber: Int {
         number + 1
     }
}

然后我有一个选择器来选择/更改数字

Picker("What times tables do you want to test your knowledge on?", selection: $data.number) {
      ForEach(0 ..< data.numberRange.count) {
         Text("\(self.data.numberRange[$0])")
      }
}

当我让文本在主屏幕上显示正确的数字并在选择器更改时进行更改/更新时,这将按预期工作

Text ("Number = \(data.correctNumber)")

然后我使用 NavigationLink 移动到第二个屏幕

NavigationLink(destination: QuestionView()) {
    Text("Start")
}

在第二个屏幕上,我设置了 @ObservedObject 并再次显示文本。

struct QuestionView: View {
    @ObservedObject var data = Data()
        
var body: some View {
    Text("Number = \(self.data.correctNumber)")
}

按“开始”时,它仅显示数字 5 + 1,而不显示使用选择器更改为的数字。

我已经尝试过了;

  • 不使用 self。但没有明显差异
  • 切换到绑定(bind) $ 并遇到以下问题;无法分配 to property: ' CorrectNumber' 是一个仅获取属性和实例 方法“appendInterpolation”要求“Binding”符合 '_格式指定'
  • 将 @Published 添加到 CorrectNumber,但我无法将其添加到 计算状态

现在我没有主意了,有人可以帮助菜鸟吗

PS,如果术语有误,我很抱歉,请随时纠正我,以便我下次学习

最佳答案

所有其他答案都是正确的。您需要选择最适合您的场景的选项。

我相信您不需要 @EnvironmentObject (它将对层次结构中的所有 View 全局可用)。现在仅传递一个数字可能就足够了,但它不可扩展(如果您想在 QuestionView 中使用 Data 的另一个属性怎么办?)。

我建议传递Data对象,但作为@ObservedObject:

NavigationLink(destination: QuestionView(data: data)) {
    Text("Start")
}
struct QuestionView: View {
    @ObservedObject var data: Data
        
    var body: some View {
        Text("Number = \(self.data.correctNumber)")
    }
}

这样对代码的更改将是最少的。如果您打算仅在 QuestionView 中使用 CorrectNumber - 您可以安全地将其移动到那里*如另一个答案中的建议)。

关于class - SwiftUI @Published 和 @ObservedObject 不会到达 NavigationLink 目的地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62733888/

相关文章:

ios - 如何创建和构建一个 swift 包

ios - 组合:监听内部集合变化

javascript - 如何在 n 秒后停用 MutationObserver?

Angular:每次需要更新时我都应该订阅()到http.get()吗?

c++ - 类运算符重载

jquery - 使用 jQuery 添加和删除类

swift - 在 SwiftUI 中使用自定义文本字段时出现内存泄漏

angular - 在重试 Observable 之前更改 HTTP header

c# - C#中继承类的问题

css - 禁用一个元素的 Bootstrap