为什么修改 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"
}