gpt4 book ai didi

ios - 为什么当我的基础数据源更新时 SwiftUI 会自动向后导航,我该如何避免这种行为?

转载 作者:行者123 更新时间:2023-12-01 16:11:46 25 4
gpt4 key购买 nike

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

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

  • 问题是更新底层项目(它是一个结构)会导致 SwiftUI 自动向后导航。我认为这是因为结构是一个不可变的值并在更新期间被销毁,但是,它确实符合 Identifiable所以我希望 SwiftUI 能够理解该项目仍然存在并且只需要更新而不是销毁。
    有没有办法在不离开详细 View 的情况下更新基础列表?
    这是一个最小的、可重现的示例。
    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)
    }
    }
    }

    最佳答案

    只需从 ForEach 中删除 id,它就会停止返回

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

    关于ios - 为什么当我的基础数据源更新时 SwiftUI 会自动向后导航,我该如何避免这种行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62721787/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com