首页 > 解决方案 > SwiftUI @Published 和 @ObservedObject 不会去 NavigationLink 目的地

问题描述

对不起,我努力总结的标题和长度

我有一类@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,而不是使用选择器更改为的数字。

我努力了;

现在我没有想法了,任何人都可以帮助一个菜鸟,拜托

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

标签: classswiftuiobservableswiftui-navigationlinkobservedobject

解决方案


您正在重新初始化 Data observed 对象,因此实际上期望视图始终显示 5 + 1。

在我看来,在给定的情况下,您实际上并不需要计算机属性,因此您可以放弃它。我的建议是将 number 属性作为绑定传递,并在 QuestionView 中简单地将其显示为 1。另一种方法是在 QuestionView 中移动计算的属性 correctNumber 但仍将 number 属性作为绑定传递。

以下是这些场景在您的情况下的样子:

  • 直接显示加1的值
class Data: ObservableObject {
     @Published var number = 5         
}

NavigationLink(destination: QuestionView(number: $data.number)) {
    Text("Start")
}

struct QuestionView: View {
    @Binding var number : Int
        
    var body: some View {
        Text("Number = \(self.number + 1)")
    }
}
  • 同样,如果您决定移动计算属性,只需更改 QuestionView 的 Text 字段以使用它,如下所示:
struct QuestionView: View {
    @Binding var number : Int
    
    var correctNumber: Int {
         self.number + 1
    }
        
    var body: some View {
        Text("Number = \(self.correctNumber)")
    }
}

推荐阅读