代码之家  ›  专栏  ›  技术社区  ›  Lorenzo Fiamingo

列表中的ForEach停止DestinationView中的更新传播

  •  0
  • Lorenzo Fiamingo  · 技术社区  · 5 年前

    ForEach

    class ModelView: ObservableObject {
        @Published var clock = Date()
        init() {
            Timer.publish(every: 1, on: .main, in: .default)
                .autoconnect()
                .print()
                .assign(to: &$clock)
        }
    }
    
    struct ContentView: View {
    
        @StateObject var viewModel = ModelView()
        
        var body: some View {
            NavigationView {
                List {
                    NavigationLink("Clock", destination: Text(viewModel.clock, formatter: formatter))
                    ForEach(0..<1) { _ in } // <- Remove this row and the clock will work
                }
            }
        }
        
        var formatter: DateFormatter {
            let formatter = DateFormatter()
            formatter.timeStyle = .medium
            return formatter
        }
    }
    
    0 回复  |  直到 5 年前
        1
  •  1
  •   Asperi    5 年前

    我想说它在第一种情况下起作用是某种巧合,因为目的地是(或者可以)在导航时复制的(在第二种情况下可能就是这样)。

    正确的方法是将独立视图与自己的观察者分离以获取详细信息。如果没有绑定,父视图不应更新子视图属性。

    struct ContentView: View {
    
        @StateObject var viewModel = ModelView()
        
        var body: some View {
            NavigationView {
                List {
                    NavigationLink("Clock", destination: DetailsView(viewModel: viewModel))
                    ForEach(0..<1) { _ in } // <- Remove this row and the clock will work
                }
            }
        }
        
    }
    
    struct DetailsView: View {
        @ObservedObject var viewModel: ModelView
        
        var body: some View {
            Text(viewModel.clock, formatter: formatter)
        }
    
        var formatter: DateFormatter {
            let formatter = DateFormatter()
            formatter.timeStyle = .medium
            return formatter
        }
    }
    
    推荐文章