NavigationLink 101: как отправить данные с хоста во вторичное представление?

#swiftui #swiftui-navigationlink

#swiftui #swiftui-navigationlink

Вопрос:

Цель: просто передать struct для каждой строки списка во вторичное представление через NavigationLink.

Первый шаг (предварительная цель): просто передайте элемент массива строк во вторичное представление.

Проблема: вторичное представление ожидает значение строки привязки в вызове параметра по сравнению со значением строки закрытия в контексте.

Поэтому я должен установить переменную @State на текущее / контекстное значение перед вызовом.

Это моя проблема. Я не могу просто приравнять переменную привязки к текущей переменной контекста; потому что в SwiftUI такие операторы ограничены только материалом, основанным на представлении.

Это не работает:

введите описание изображения здесь

Вот фактический код:

 import SwiftUI
  
struct ContentView: View {
    @State var name = ""   //... load with inital value to avoid having to add a call parameter.
    
    var body: some View {
        let myArray = ["Larry", "Moe", "Curly"]
        NavigationView {
            List(myArray, id: .self) { theStooge in
                NavigationLink(destination: SecondView(stoogeName: theStooge)) {
                    Text(theStooge)
                }
            }
            .navigationBarTitle("Three Stooges").navigationBarTitleDisplayMode(.inline)
        }
    }
}

struct SecondView: View {
    @Binding var stoogeName: String
    var body: some View {
        Text("Hello (name)")
    }
}
 

Я могу просто создать secondView с помощью текста («Привет, мир») в параметре назначения NavigationLink. Но это не очень полезно. Я хочу передать данные (структуру данных) во вторичное представление для каждого члена списка.

Но мне нужно установить переменную привязки. Как?
Должен ли я настраивать EnvironmentObject или Singleton?

Ответ №1:

Привязка может быть установлена на динамическое свойство, но ваш массив является постоянной локальной переменной. Вот возможное решение для работы с привязкой:

 struct ContentView: View {
    @State var name = ""   //... load with inital value to avoid having to add a call parameter.
    
    @State private var myArray = ["Larry", "Moe", "Curly"]

    var body: some View {
        NavigationView {
            List(myArray.indices, id: .self) { index in
                NavigationLink(destination: SecondView(stoogeName: $myArray[index])) {
                    Text(myArray[index])
                }
            }
            .navigationBarTitle("Three Stooges").navigationBarTitleDisplayMode(.inline)
        }
    }
}