class - 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,而不是使用选择器更改为的数字。
我努力了;
- 不使用自我。但没有明显的区别
- 切换到绑定 $ 并遇到以下问题;无法分配给属性:“correctNumber”是一个仅获取属性,实例方法“appendInterpolation”要求“Binding”符合“_FormatSpecifiable”
- 将 @Published 添加到 correctNumber 但我无法将其添加到计算状态
现在我没有想法了,任何人都可以帮助一个菜鸟,拜托
PS如果术语有误,请见谅,请随时纠正我,以便我下次学习
解决方案
您正在重新初始化 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)")
}
}
推荐阅读
- node.js - Telegraf:“replyWithInvoice”不适用于“callback_query::”
- mysql - 使用十六进制表示法将 UTF 符号插入 Mysql
- powershell - PowerShell 开关参数未按预期工作
- swift - xcode中“产品”下的“应用程序”是什么?
- python - 仅读取单行时,会丢弃命名管道内容
- javascript - 从非异步调用 Async/await 函数并添加值返回未定义
- android - filter() 方法不适用于我的列表视图
- node.js - 在 MVC Express 应用程序中创建数据库服务
- vue.js - 如何让管理员在 Vue 应用程序中编辑一些文本?
- algorithm - LinkedList 有什么区别?