【问题标题】:NavigationLink is activated automaticallyNavigationLink 自动激活
【发布时间】:2020-11-24 20:12:46
【问题描述】:

我在 CoreData SwiftUI 项目中有以下代码:

import SwiftUI

struct ContentView: View {
    
    @FetchRequest(entity: TestObject.entity(), sortDescriptors: [NSSortDescriptor(keyPath: \TestObject.name, ascending: true)]) var objects: FetchedResults<TestObject>
    
    @Environment(\.managedObjectContext) var managedObjectContext
    
    @State private var showFavorites = true
    
    var body: some View {
        NavigationView {
            List {
                if(showFavorites) {
                    Section(header: Text("Favorites").font(.headline).padding(.leading, -8)) {
                        ForEach(self.objects.filter({ (testObj) -> Bool in
                            return testObj.isFavorite
                        }), id: \.id)  { obj in
                            NavigationLink(destination: DetailsView(testObject: obj)) {
                                Text(obj.name ?? "")
                            }
                        }
                    }
                }
                Section(header: Text("All").font(.headline).padding(.leading, -8)) {
                    ForEach(self.objects, id: \.id)  { obj in
                        NavigationLink(destination: DetailsView(testObject: obj)) {
                            Text(obj.name ?? "")
                        }
                    }
                }
            }.listStyle(GroupedListStyle())
            .environment(\.horizontalSizeClass, .regular)
            .navigationBarTitle("Test", displayMode: .large)
            .navigationBarItems(
                trailing: Button(action: {
                    let newObj = TestObject(context: self.managedObjectContext)
                    newObj.name = "newTest"
                    newObj.id = UUID()
                    newObj.isFavorite = false
                    do {
                        try self.managedObjectContext.save()
                    } catch let error {
                        print(error)
                        print("error saving object")
                    }
                }) {
                    Image(systemName: "plus")
                }
            )
        }
    }
}

struct DetailsView : View{
    
    @ObservedObject var testObject : TestObject
    
    var body : some View {
        VStack {
            Text(testObject.name ?? "")
        }.navigationBarTitle("Detail")
        .navigationBarItems(
            trailing: HStack {
                Button(action: {
                    self.testObject.isFavorite.toggle()
                }) {
                    Image(systemName: self.testObject.isFavorite ? "heart.fill" : "heart")
                }
            }
        )
    }
}

以及 xcdatamodeld 文件中的这个实体:

如果我是第一次启动应用程序,我可以通过点击 NavigationBar 中的加号图像来添加新的 TestObjects,然后将其添加到列表中。如果我然后点击其中一个对象,我会导航到 DetailsView。在此视图上,用心脏点击 NavigationBarButton 应该将该对象标记为收藏,这样如果用户向后导航,这也会显示在列表的第一部分,即收藏夹。到目前为止它有效,但我有这个奇怪的效果:

Video on Imgur

似乎收藏夹部分中额外元素的 NavigationLink 已自动触发。知道如何解决这个问题吗?

提前致谢

【问题讨论】:

标签: core-data swiftui swiftui-list swiftui-navigationlink


【解决方案1】:

尝试以下(无法测试您的代码,所以只是一个想法)

struct DetailsView : View {

    @ObservedObject var testObject : TestObject

    @State private var isFavorite: Bool

    init(testObject: TestObject) {
        self.testObject = testObject
        _isFavorite = State(initialValue: testObject.isFavorite)
    }

    var body : some View {
        VStack {
            Text(testObject.name ?? "")
        }.navigationBarTitle("Detail")
        .navigationBarItems(
            trailing: HStack {
                Button(action: {
                    self.isFavorite.toggle()
                }) {
                    Image(systemName: self.isFavorite ? "heart.fill" : "heart")
                }
            }
        )
        .onDisappear {
            DispatchQueue.main.async {     // << this might be redundant, try w/ and w/o
                self.testObject.isFavorite = self.isFavorite
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 2020-06-13
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 2011-05-17
    • 1970-01-01
    • 1970-01-01
    • 2021-12-15
    • 2010-11-14
    相关资源
    最近更新 更多