SwiftUI NavigationLink 立即返回导航

6
我正在使用SwiftUI创建NavigationLinks,将行与详细视图连接在NavigationView中(类似于教程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)
    }
}

使用 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) { ... } 时,导航按预期工作。
2个回答

3

通过将 ForEach(Query.items) 更改为 ForEach(Array(Query.items)),使数据静态化,从而修复了问题。


使数据静态化是什么意思? - Zorayr
领域查询返回一个 Results 实例,该实例会根据 Realm 中所做的更改而保持最新状态。请参阅 https://realm.io/docs/swift/latest/#queries。我将 Results 实例的类型更改为 Array,以便通过 ForEach 函数正确地将对象传递到 SwiftUI。 - bioround

-1
原因是ForEach(Query.items, id: \.self)缺少标识符。当您添加一个hashable\.self时,该列表应该能正常工作。

1
谢谢。我刚试了一下,列表工作得很好,但当我点击导航链接后它仍然立即返回到原始视图。看起来这是关于RealmSwift中的Results对象的问题。当我使用静态数据时,导航就像预期的那样工作。 - bioround
问题仍然存在,请参考使用 id: \.self 的简单设置,https://dev59.com/Q7voa4cB1Zd3GeqP44BQ - Zorayr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接