ForEach NavigationLink с состоянием и привязкой - PullRequest
2 голосов
/ 23 февраля 2020

Я пытаюсь сгенерировать 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 ]

1 голос
/ 23 февраля 2020

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

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

1 голос
/ 23 февраля 2020

Используйте следующее в 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 вы меняете тот же объект.

...