【问题标题】:Why does modifying the label of a NavigationLink change which View is displayed in SwiftUI?为什么修改 NavigationLink 的标签会改变 SwiftUI 中显示的 View?
【发布时间】:2020-09-10 14:16:33
【问题描述】:

我有一个名为wordWord 类型)的@EnvironmentObject,我将其identifier 属性用于SwiftUI 中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,目前无法更新,所以如果已经修补,请告诉我。

【问题讨论】:

    标签: swift xcode swiftui xcode11 swiftui-navigationlink


    【解决方案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
            }
        }
    }
    

    【讨论】:

      【解决方案2】:

      这在 iOS 13.4 上按预期工作,假设 Word 类似于:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-09-29
        • 1970-01-01
        • 2020-08-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-10
        相关资源
        最近更新 更多