ForEach NavigationLink с состоянием и привязкой

Я пытаюсь создать ForEach с помощью NavigationLink и использовать State и Binding для передачи некоторого объекта:

struct ContentView: View {
    @Environment(\.managedObjectContext) var moc

    @FetchRequest(
        entity: MyEntity.entity(),
        sortDescriptors: [
            NSSortDescriptor(keyPath: \MyEntity.name, ascending: true)
        ]

    ) var entries: FetchedResults<MyEntity>

    var body: some View {
        NavigationView {
            List {
                ForEach(entries, id: \.self) { (entry: MyEntity) in
                    NavigationLink(destination: DetailView(myEntry: $entry)) {
                        Text(entry.name!)
                    }
                }.
            }
        }
    }
}

А потом такой вид:

struct DetailView: View {
    @Binding var myEntry: MyEntity

    var body: some View {
        Text(myEntry.name!)
    }
}

Проблема в том, что я не могу передать значение в подробное представление из-за ошибки:

Use of unresolved identifier '$entry'

Что здесь не так и как это решить?

Если бы у меня был простой @State нет проблем передать его через привязку, но я хочу / должен использовать его в ForEach для FetchedResults

РЕДАКТИРОВАТЬ: если я удалю $ я получил Cannot convert value of type 'MyEntity' to expected argument type 'Binding<MyEntity>'

EDIT2: цель состоит в том, чтобы передать некоторый объект в DetailView, а затем передать его позже в ContentView

2 ответа

Решение

Используйте следующее в ForEach

   ForEach(entries, id: \.self) { entry in
        NavigationLink(destination: DetailView(myEntry: entry)) {
            Text(entry.name!)
        }
    }

и следующие в DetailView

struct DetailView: View {
    var myEntry: MyEntity

    var body: some View {
        Text(myEntry.name!)
    }
}

В MyEntity это класс, поэтому вы передаете объект по ссылке и меняете его в DetailView вы меняете тот же объект.

FetchedResults<MyEntity> entities не соответствует Binding или DynamicProperty. Для$ символ тренировки должен соответствовать Binding.

Вы можете сделать FetchedResultsController в ObservableObject чтобы получить ту же функциональность, что и @FetchRequestи иметь возможность передавать значения в EnvironmentObject или ObservedObject.

Другие вопросы по тегам