SwiftUI @Published 和@ObservedObject 不会转到 NavigationLink 目的地
SwiftUI @Published and @ObservedObject not going to NavigationLink destination
抱歉标题和篇幅让我费尽心思
我有一个 class 的 @ObserableObject @Published 数据,我想更改它并在通过 NavigationLink 访问的第二页上使用新数据
class Data: ObservableObject {
@Published var number = 5
var correctNumber: Int {
number + 1
}
}
然后我有一个选择器choose/change号码
Picker("What times tables do you want to test your knowledge on?", selection: $data.number) {
ForEach(0 ..< data.numberRange.count) {
Text("\(self.data.numberRange[[=11=]])")
}
}
This works as expected when I have the Text show the corrected number on the main screen and changes/updates when the picker is changed
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 而不是使用选择器更改为的数字。
我试过了;
- 没有使用自己。但没有明显的区别
- 交换到绑定 $ 并遇到以下问题;无法分配
to 属性: 'correctNumber' 是一个 get-only 属性 and Instance
方法 'appendInterpolation' 要求 'Binding' 符合
'_FormatSpecifiable'
- 将@Published 添加到 correctNumber 但我无法将其添加到
计算状态
现在我没主意了,请任何人帮助一个菜鸟
PS如果术语有误,请随时指正,以便下次学习
您正在重新初始化数据观察对象,因此实际上期望视图始终显示 5 + 1。
在我看来,在给定的情况下您并不真正需要计算机 属性,因此您可以抛弃它。我的建议是将数字 属性 作为绑定传递,并在您的 QuestionView 中简单地将其显示为递增 1。另一种方法是将计算出的 属性 correctNumber 移动到您的 QuestionView 中,但仍将数字 属性 作为绑定传递。
在您的案例中,这些场景是这样的:
- 直接显示加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 的文本字段以改为使用它:
struct QuestionView: View {
@Binding var number : Int
var correctNumber: Int {
self.number + 1
}
var body: some View {
Text("Number = \(self.correctNumber)")
}
}
所有其他答案都是正确的。您需要选择最适合您的场景的内容。
我相信您不需要 @EnvironmentObject
(它将对层次结构中的所有视图全局可用)。现在只传递一个数字可能就足够了,但它不可扩展(如果你想在 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 的 @ObserableObject @Published 数据,我想更改它并在通过 NavigationLink 访问的第二页上使用新数据
class Data: ObservableObject {
@Published var number = 5
var correctNumber: Int {
number + 1
}
}
然后我有一个选择器choose/change号码
Picker("What times tables do you want to test your knowledge on?", selection: $data.number) {
ForEach(0 ..< data.numberRange.count) {
Text("\(self.data.numberRange[[=11=]])")
}
}
This works as expected when I have the Text show the corrected number on the main screen and changes/updates when the picker is changed
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 而不是使用选择器更改为的数字。
我试过了;
- 没有使用自己。但没有明显的区别
- 交换到绑定 $ 并遇到以下问题;无法分配 to 属性: 'correctNumber' 是一个 get-only 属性 and Instance 方法 'appendInterpolation' 要求 'Binding' 符合 '_FormatSpecifiable'
- 将@Published 添加到 correctNumber 但我无法将其添加到 计算状态
现在我没主意了,请任何人帮助一个菜鸟
PS如果术语有误,请随时指正,以便下次学习
您正在重新初始化数据观察对象,因此实际上期望视图始终显示 5 + 1。
在我看来,在给定的情况下您并不真正需要计算机 属性,因此您可以抛弃它。我的建议是将数字 属性 作为绑定传递,并在您的 QuestionView 中简单地将其显示为递增 1。另一种方法是将计算出的 属性 correctNumber 移动到您的 QuestionView 中,但仍将数字 属性 作为绑定传递。
在您的案例中,这些场景是这样的:
- 直接显示加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 的文本字段以改为使用它:
struct QuestionView: View {
@Binding var number : Int
var correctNumber: Int {
self.number + 1
}
var body: some View {
Text("Number = \(self.correctNumber)")
}
}
所有其他答案都是正确的。您需要选择最适合您的场景的内容。
我相信您不需要 @EnvironmentObject
(它将对层次结构中的所有视图全局可用)。现在只传递一个数字可能就足够了,但它不可扩展(如果你想在 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
- 您可以安全地将其移动到那里 *如另一个答案中所建议的那样)。