为什么修改 NavigationLink 的标签会改变 SwiftUI 中显示的视图?
Why does modifying the label of a NavigationLink change which View is displayed in SwiftUI?
我有一个名为 word
(类型为 Word
)的 @EnvironmentObject
,我将其 identifier
属性 用作 NavigationLink 的标签斯威夫特用户界面。对于链接到 NavigationLink 的 DetailView,我只放了这个:
struct DetailView: View {
@EnvironmentObject var word: Word
var body: some View {
VStack {
Text(word.identifier)
Button(action: {
self.word.identifier += "a"
}) {
Text("Click to add an 'a' to Word's identifier")
}
}
}
}
导致此 DetailView 的 ContentView 如下所示(我简化了我的实际代码以隔离问题)。
struct ContentView: View {
@EnvironmentObject var word: Word
var body: some View {
NavigationView {
NavigationLink(destination: DetailView()) {
Text(word.identifier)
}
}
}
}
当我点击 DetailView 上的按钮时,我希望它使用新的 word.identifier
更新 DetailView,该 word.identifier
附加了一个额外的 "a"。然而,当我点击它时,它会将我带回到 ContentView,尽管更新了 word.identifier
。当 ContentView 的 NavigationLink 使用的 word.identifier
被修改时,我似乎无法找到留在我的 DetailView 上的方法。另外,我是 运行 Xcode 11.3.1,目前无法更新,所以如果已经修补,请告诉我。
这是解决方法
struct DetailView: View {
@EnvironmentObject var word: Word
@State private var identifier: String = ""
var body: some View {
VStack {
Text(self.identifier)
Button(action: {
self.identifier += "a"
}) {
Text("Click to add an 'a' to Word's identifier")
}
}
.onAppear {
self.identifier = self.word.identifier
}
.onDisappear {
self.word.identifier = self.identifier
}
}
}
这在 iOS 13.4 上按预期工作,假设 Word 类似于:
class Word : ObservableObject {
@Published var identifier = "foo"
}
我有一个名为 word
(类型为 Word
)的 @EnvironmentObject
,我将其 identifier
属性 用作 NavigationLink 的标签斯威夫特用户界面。对于链接到 NavigationLink 的 DetailView,我只放了这个:
struct DetailView: View {
@EnvironmentObject var word: Word
var body: some View {
VStack {
Text(word.identifier)
Button(action: {
self.word.identifier += "a"
}) {
Text("Click to add an 'a' to Word's identifier")
}
}
}
}
导致此 DetailView 的 ContentView 如下所示(我简化了我的实际代码以隔离问题)。
struct ContentView: View {
@EnvironmentObject var word: Word
var body: some View {
NavigationView {
NavigationLink(destination: DetailView()) {
Text(word.identifier)
}
}
}
}
当我点击 DetailView 上的按钮时,我希望它使用新的 word.identifier
更新 DetailView,该 word.identifier
附加了一个额外的 "a"。然而,当我点击它时,它会将我带回到 ContentView,尽管更新了 word.identifier
。当 ContentView 的 NavigationLink 使用的 word.identifier
被修改时,我似乎无法找到留在我的 DetailView 上的方法。另外,我是 运行 Xcode 11.3.1,目前无法更新,所以如果已经修补,请告诉我。
这是解决方法
struct DetailView: View {
@EnvironmentObject var word: Word
@State private var identifier: String = ""
var body: some View {
VStack {
Text(self.identifier)
Button(action: {
self.identifier += "a"
}) {
Text("Click to add an 'a' to Word's identifier")
}
}
.onAppear {
self.identifier = self.word.identifier
}
.onDisappear {
self.word.identifier = self.identifier
}
}
}
这在 iOS 13.4 上按预期工作,假设 Word 类似于:
class Word : ObservableObject {
@Published var identifier = "foo"
}