2

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

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

我努力了;

  • 不使用自我。但没有明显的区别
  • 切换到绑定 $ 并遇到以下问题;无法分配给属性:“correctNumber”是一个仅获取属性,实例方法“appendInterpolation”要求“Binding”符合“_FormatSpecifiable”
  • 将 @Published 添加到 correctNumber 但我无法将其添加到计算状态

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

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

4

2 回答 2

1

您正在重新初始化 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)")
    }
}
于 2020-07-04T21:10:26.273 回答
1

所有其他答案都是正确的。您需要选择最适合您的方案的内容。

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

我建议传递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)")
    }
}

这种方式对您的代码的更改将是最小的。而且,如果您打算仅使用correctNumberQuestionView-您可以安全地将其移到那里*如另一个答案中所建议的那样)。

于 2020-07-05T08:05:50.693 回答