Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 为什么当我的基础数据源更新时,SwiftUI会自动向后导航?我如何避免这种行为?_Ios_Swift_Swiftui_Ios Navigationview - Fatal编程技术网

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

Ios 为什么当我的基础数据源更新时,SwiftUI会自动向后导航?我如何避免这种行为?,ios,swift,swiftui,ios-navigationview,Ios,Swift,Swiftui,Ios Navigationview,我有一个相当常见的设置: 使用ForEach组件创建的项目列表 点击某个项目时,我的应用程序将导航到详细视图 在详细视图中,用户可以执行更改基础项的更新 问题是更新基础项(结构)会导致SwiftUI自动向后导航。我假设这是因为结构是一个不可变的值,并且在更新过程中会被销毁,但是,它确实符合可识别的,因此我希望SwiftUI理解该项仍然存在,只需要更新而不是销毁 是否有任何方法可以在不离开详细信息视图的情况下更新基础列表? 这里有一个最小的,可重复的例子 import SwiftUI str

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

  • 使用
    ForEach
    组件创建的项目列表
  • 点击某个项目时,我的应用程序将导航到详细视图
  • 在详细视图中,用户可以执行更改基础项的更新
问题是更新基础项(结构)会导致SwiftUI自动向后导航。我假设这是因为结构是一个不可变的值,并且在更新过程中会被销毁,但是,它确实符合
可识别的
,因此我希望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)                
            }
    }
}

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

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

嗯,行了!你介意解释一下为什么会这样吗?那是因为你正在使NavigationLink无效,看看这个问题的答案: