#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)
}
}
}