为什么修改NavigationLink的标签会更改SwiftUI中显示的视图?

时间:2020-05-23 18:49:32

标签: swift xcode swiftui xcode11 swiftui-navigationlink

我有一个名为@EnvironmentObject的{​​{1}}(类型为word),其Word属性用于SwiftUI中NavigationLink的标签。对于链接到NavigationLink的DetailView,我只输入以下内容:

identifier

导致此DetailView的ContentView看起来像这样(我简化了实际代码以找出问题所在。)

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上的按钮时,我希望它使用新的struct ContentView: View { @EnvironmentObject var word: Word var body: some View { NavigationView { NavigationLink(destination: DetailView()) { Text(word.identifier) } } } } 附加一个额外的“ a”来更新DetailView。但是,当我点击它时,它会带我回到ContentView,尽管它带有更新的word.identifier。修改ContentView的NavigationLink使用的word.identifier时,我似乎找不到保留在DetailView上的方法。另外,我正在运行Xcode 11.3.1,当前无法更新,因此,如果已对此进行了修补,请告诉我。

2 个答案:

答案 0 :(得分:0)

这是解决方法

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
        }
    }
}

答案 1 :(得分:0)

假设Word类似于:

,此功能可以在iOS 13.4上正常运行。

class Word : ObservableObject {
    @Published var identifier = "foo"
}