在 NavigationLink 的嵌套 NavigationView 中列出核心数据对象的正确方法

Posted

技术标签:

【中文标题】在 NavigationLink 的嵌套 NavigationView 中列出核心数据对象的正确方法【英文标题】:The correct way to list CoreData object in nest NavigationView in NavigationLink 【发布时间】:2020-08-19 09:48:00 【问题描述】:

在 xcode 12 (swift 5.3) 中,我使用条件 navigationLink 导航到另一个 navigationView 以使用 NavigationLink 列出 coreData 对象。但似乎 AnotherView 的 NavigationTitle 无法正确显示在屏幕顶部,而是填充到顶部。另一个 navigationView 中的列表具有外部白色背景色。我想传递给SomethingView 的something.id 报告Argument passed to call that takes no arguments 错误,但我可以在Text 中得到something.name。

struct StartView: View 
    @State var changeToAnotherView: String? = nil
    var body: some View 
        NavigationView 
            VStack(spacing: 20) 
                ...
                NavigationLink(destination: AnotherView(), tag: "AnotherView",
                               selection: $changeToAnotherView)  EmptyView() 
            
        
    


struct AnotherView: View 
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(entity: Something.entity(), sortDescriptors: []) var somethings: FetchedResults<Something>
    ...
    var body: some View 
        NavigationView 
            List 
                ForEach(self.somethings, id: \.id)  something in
                    NavigationLink(destination: SomethingView(somethingID: something.id)) 
                        Text(something.name ?? "unknown name")
                    
                
            
            .navigationBarTitle("SomethingList")
        
    

【问题讨论】:

【参考方案1】:

你不需要第二个NavigationView - 它必须只是视图层次结构中的一个,并且最好通过引用传递CoreData对象(视图将能够观察它),所以

struct AnotherView: View 
    @Environment(\.managedObjectContext) var moc
    @FetchRequest(entity: Something.entity(), sortDescriptors: []) var somethings: FetchedResults<Something>
    ...
    var body: some View 
        List 
            ForEach(self.somethings, id: \.id)  something in
                NavigationLink(destination: SomethingView(something: something)) 
                    Text(something.name ?? "unknown name")
                
            
        
        .navigationBarTitle("SomethingList")
    


struct SomethingView: View 
   @ObservedObject var something: Something

   var body: some View 

   // .. your next code

【讨论】:

非常感谢。似乎something: something 也报告了相同的no arugment 错误。如何将选择的内容传递给SomethingView_Previews: PreviewProvider?. 考虑这个话题***.com/a/63388918/12299030

以上是关于在 NavigationLink 的嵌套 NavigationView 中列出核心数据对象的正确方法的主要内容,如果未能解决你的问题,请参考以下文章

从网络请求更新 EnvironmentObject 后,NavigationLink 在嵌套的 ScrollView 中不起作用

SwiftUI中NavigationLink多层嵌套导航无法返回上一层的原因及解决

SwiftUI中NavigationLink多层嵌套导航无法返回上一层的原因及解决

如何在另一个 NavigationLink 中有一个 NavigationLink

SwiftUI 在 NavigationLink 视图中隐藏 TabView 栏

NavigationLink 中的 SwiftUI 按钮