SwiftUI NavigationLink 立即导航回来

Posted

技术标签:

【中文标题】SwiftUI NavigationLink 立即导航回来【英文标题】:SwiftUI NavigationLink immediately navigates back 【发布时间】:2020-04-27 11:31:55 【问题描述】:

我正在使用 SwiftUI 在 NavigationView 中创建从行到详细视图的 NavigationLinks(类似于教程 https://developer.apple.com/tutorials/swiftui/building-lists-and-navigation 中所做的事情)。但是,当我在我的应用程序中进行测试时,NavgiationLink 在被点击后会立即从详细视图导航回上一个视图(详细视图仅显示一秒钟)。

代码如下:

struct ItemsView: View 
    var body: some View 
        NavigationView 
            VStack 
                List 
                    ForEach(Query.items)  item in
                        NavigationLink(destination: ItemDetail(item: item)) 
                            ItemRow(item: item)
                        
                    
                
                Spacer()
            
            .navigationBarTitle(Text("Items"))
        
    


private struct ItemRow: View 
    var item: Item

    var body: some View 
        VStack(alignment: .leading) 
            Text(item.title)
                .font(.headline)
            item.completionDate.map(
                Text("Created \($0.shortDateTime)")
            )
            item.completionDate.map(
                Text("Active \(Date().offsetString(from: $0)) ago")
            )
        
    


struct ItemDetail: View 
    var item: Item

    var body: some View 
        VStack 
            Text("\(item.title)")
            Text("\(String(describing: item.creationDate))")
            Text("\(String(describing: item.completionDate))")
            Text("\(item.complete)")
        
        .navigationBarTitle(Text("Item"), displayMode: .inline)
    

Query 是使用 Realm 完成的:

let realm = try! Realm()

class Query 
    static let items = realm.objects(Item.self)

这似乎是从realm.objects(Item.self) 返回的Results<Item> 对象的问题。当我使用let items = [Item(), Item()] 尝试使用静态数据然后调用ForEach(items) ... 时,导航按预期工作。

【问题讨论】:

【参考方案1】:

通过将 ForEach(Query.items) 更改为 ForEach(Array(Query.items)) 以使数据静态化来修复它。

【讨论】:

静态数据是什么意思? 领域查询返回一个Results 实例,该实例与领域中所做的更改保持同步。见realm.io/docs/swift/latest/#queries。我将Results 实例的类型更改为Array 以正确地将对象传递给SwiftUI 的ForEach 函数。【参考方案2】:

原因是ForEach(Query.items, id: \.self) 缺少标识符。当您添加一个 hashable\.self 时。列表应该像魅力一样工作。

【讨论】:

谢谢。我刚刚尝试过,列表运行良好,但在我点击它后,navigationLink 仍会立即路由回原始视图。 RealmSwift Results 对象似乎有问题。当我尝试使用静态数据时,导航按预期工作。 问题依然存在,使用id: \.self,***.com/questions/62275502/…查看简单设置

以上是关于SwiftUI NavigationLink 立即导航回来的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI:如果在 ForEach 中使用 NavigationLink 会立即弹出

SwiftUI:在 Tabview 的 WatchOS 8.1RC 上立即弹出 NavigationLink

如果它不可见,SwiftUI 如何使 NavigationLink 工作?

SwiftUI NavigationLink:成功运行帐户创建代码后导航到目标视图

SwiftUI NavigationLink 如何到达另一个 SwiftUI 页面?

NavigationLink 中的 SwiftUI 按钮