NavigationLink активируется автоматически

У меня есть следующий код внутри проекта 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:

содержимое файла xcdatamodeld

Если я запускаю приложение в первый раз, я могу добавить новые объекты TestObject, нажав на значок «плюс» на панели навигации, которые затем будут добавлены в список. Если я затем коснусь одного из объектов, я перейду к DetailsView. В этом представлении нажатие кнопки NavigationBarButton с сердечком должно пометить объект как избранный, так что, если пользователь перейдет назад, он также отображается в первой части списка, избранное. Пока это работает, но у меня такой странный эффект:

Видео на Imgur

Похоже, что автоматически запускается NavigationLink для дополнительного элемента в разделе избранного. Есть идеи, как я могу это исправить?

заранее спасибо


person cyf    schedule 04.08.2020    source источник
comment
Следующая тема кажется вам полезной stackoverflow.com/a/61153180/12299030   -  person Asperi    schedule 04.08.2020
comment
Это похоже на проблему. Однако, если я обновлю свой код, у меня все равно будет такое же поведение. Вот мой код с предоставленным решением из сообщения: pastebin.com/CabS94UZ   -  person cyf    schedule 04.08.2020
comment
Я просто понял, что теперь это работает лучше. У меня все еще возникают странные прыжки, если я нажимаю кнопку с сердцем. Но после этого я могу по крайней мере без проблем перейти к избранному элементу.   -  person cyf    schedule 04.08.2020


Ответы (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
            }
        }
    }
}
person Asperi    schedule 08.08.2020
comment
Поначалу кажется, что это работает. Но после некоторого тестирования снова появляется та же проблема. - person cyf; 13.08.2020