【问题标题】:Why does SwiftUI automatically navigate backwards when my underlying data source is updated and how can I avoid this behavior?为什么当我的基础数据源更新时 SwiftUI 会自动向后导航,我该如何避免这种行为?
【发布时间】:2020-07-03 19:39:40
【问题描述】:

我有一个相当常见的设置:

  • 使用ForEach 组件创建的项目列表
  • 点击某个项目时,我的应用会导航到详细视图
  • 在详细视图中,用户可以执行更新以更改基础项目

问题在于更新底层项目(它是一个结构)会导致 SwiftUI 自动向后导航。我认为这是因为该结构是一个不可变的值并在更新期间被销毁,但是,它确实符合Identifiable,所以我希望 SwiftUI 能够理解该项目仍然存在并且只需要更新而不是销毁。

有没有办法在不离开详细视图的情况下更新基础列表?

这是一个最小的、可重现的示例。

import SwiftUI

struct ContentView: View {
    var body: some View {
       DemoList(viewModel: ViewModel())
    }
}

struct DemoItem: Codable, Hashable, Identifiable {
    var id: UInt
    var description: String
}

final class ViewModel: ObservableObject, Identifiable {
    @Published var list = [
        DemoItem(id: 1, description: "One"),
        DemoItem(id: 2, description: "two")
    ]
    
    /// This update causes SwiftUI to automatically navigate away from the detail view
    func update(item: DemoItem) {
        list = list.map { $0.id == item.id ? item : $0 }
    }
}

struct DemoList: View {
    @ObservedObject var viewModel: ViewModel
    
    var body: some View {
        NavigationView {
            ForEach(viewModel.list, id: \.self) { item in
                NavigationLink(destination: DemoDetail(viewModel: self.viewModel, item: item)) {
                    Text(item.description)
                }
            }
        }
    }
}

struct DemoDetail: View {
    @ObservedObject var viewModel: ViewModel
    var item: DemoItem
    
    var body: some View {
        Text(item.description)
            .onTapGesture {
                let newItem = DemoItem(id: self.item.id, description: UUID().uuidString)
                self.viewModel.update(item: newItem)                
            }
    }
}

【问题讨论】:

    标签: ios swift swiftui ios-navigationview


    【解决方案1】:

    只需从 ForEach 中删除 id,它就会停止向后导航

    ForEach(viewModel.list) { item in
          NavigationLink(destination: DemoDetail(viewModel: self.viewModel, item: item)) {
          Text(item.description)
        }
    }
    

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-08-16
    • 1970-01-01
    • 2021-05-26
    • 2018-12-18
    • 2018-08-14
    • 1970-01-01
    • 2023-01-14
    • 2018-05-05
    相关资源
    最近更新 更多