У меня есть представление, которое содержит навигационное сопротивление, которое принимает аргумент «Путь» типа: привязка < /code>.
(i 'M Планируйте использовать это представление в качестве контейнера навигации.) > Класс, который владеет фактической @publised переменной. Я хочу сделать это более гибким. < /P>
Рабочее, но жесткое решение: < /p>
Код: Выделить всё
struct ContainerView: View {
@ObservedObject var router: Router
let initialView: InitialView
var body: some View {
NavigationStack(path: $router.path) {
self.initialView
.navigationDestination(for: NavigationDestination.self) { destination in
switch destination {
case .mainScreen:
Text("Error")
.onAppear() {
assertionFailure()
}
case .details(let detailsView):
detailsView
}
}
}
}
}
Я думал, что смогу вручную создать вычисленное свойство привязки типа из @published переменная типа [NavigationDestination] в классе маршрутизатора Как это:
Код: Выделить всё
var pathBinding: Binding {
let binding = Binding(
get: { self.path },
set: { self.path = $0 }
)
return binding
}
Код: Выделить всё
struct ContainerView: View {
var path: Binding
let initialView: InitialView
var body: some View {
NavigationStack(path: path) {
self.initialView
.navigationDestination(for: NavigationDestination.self) { destination in
switch destination {
case .mainDiscoveryScreen:
Text("Error")
.onAppear() {
assertionFailure()
}
case .details(let detailsView):
detailsView
.onAppear() {
print("Details shown")
}
}
}
}
}
}
< /code>
Создание представления: < /p>
let discoveryContainerView = DiscoveryContainerView(path: pathBinding, initialView: suggestionsView)
< /code>
Этот код скомпилирован, но не работал. Когда исходная переменная пути изменилась, ничего не произошло. Это означает, что я не мог создать протокол со свойством @published
Подробнее здесь: https://stackoverflow.com/questions/794 ... a-referenc