- в портретной ориентации: макет на основе TabView
- в альбомной ориентации: макет в стиле NavigationSplitView
Изменяться должен только внешний макет — внутреннее представление должно сохранять свое состояние.
Что лучше и самый безопасный способ добиться этого?
Это работает, когда я создаю ViewModel в корне и внедряю ее:
Код: Выделить всё
struct SubView: View {
@ObservedObject var viewModel: ViewModel
...
}
struct RootView: View {
@State var useTabLayout = true
@StateObject var subViewModel = SubView.ViewModel()
var body: some View {
VStack {
Toggle("TabLayout", isOn: $useTabLayout)
if useTabLayout {
LayoutA {
SubView(viewModel: subViewModel)
}
} else {
LayoutB {
SubView(viewModel: subViewModel)
}
}
}
}
}
Код: Выделить всё
struct SubView: View {
@StateObjekt var viewModel = ViewModel() // ViewModel created / owend by SubView
...
}
Код: Выделить всё
// Option A — Keep a single instance
struct RootView: View {
@State var useTabLayout = true
private let subView = SubView() // ← create only once
var body: some View {
VStack {
Toggle("TabLayout", isOn: $useTabLayout)
if useTabLayout {
LayoutA { subView }
} else {
LayoutB { subView }
}
}
}
}
// Option B — Fix identity with .id()
struct RootView: View {
@State var useTabLayout = true
var body: some View {
VStack {
Toggle("TabLayout", isOn: $useTabLayout)
if useTabLayout {
LayoutA { SubView().id("Subview") }
} else {
LayoutB { SubView().id("Subview") }
}
}
}
}
Вопрос
Являются ли эти подходы правильными и безопасными?
Как лучше всего сохранять @StateObject при переключении между двумя совершенно разными макетами в SwiftUI?
Подробнее здесь: https://stackoverflow.com/questions/798 ... -swiftui-l
Мобильная версия