Я хочу создать очень простую боковую панель iOS 14 с помощью SwiftUI. Настройка довольно проста, у меня есть три представления HomeView
, LibraryView
и SettingsView
и перечисление, представляющее каждый экран.
enum Screen: Hashable {
case home, library, settings
}
Моя конечная цель - автоматически переключаться между вкладкой и боковой панелью в зависимости от класса размера, но некоторые вещи работают не совсем так, как ожидалось.
Глобальное состояние принадлежит MainNavigationView
, который также является корневым представлением для моего WindowGroup
.
struct MainNavigationView: View {
@State var screen: Screen? = .home
var body: some View {
NavigationView {
SidebarView(state: $screen)
}
.navigationViewStyle(DoubleColumnNavigationViewStyle())
}
}
SidebarView
- это простой List
, содержащий три NavigationLink
, по одному на каждый Screen
.
struct SidebarView: View {
@Binding var state: Screen?
var body: some View {
List {
NavigationLink(
destination: HomeView(),
tag: Screen.home,
selection: $state,
label: {
Label("Home", systemImage: "house" )
})
NavigationLink(
destination: LibraryView(),
tag: Screen.library,
selection: $state,
label: {
Label("Library", systemImage: "book")
})
NavigationLink(
destination: SettingsView(),
tag: Screen.settings,
selection: $state,
label: {
Label("Settings", systemImage: "gearshape")
})
}
.listStyle(SidebarListStyle())
.navigationTitle("Sidebar")
}
}
Я использую инициализатор NavigationLink(destination:tag:selection:label)
, чтобы выбранный экран был установлен в моем MainNavigationView
, чтобы я мог повторно использовать его для своего TabView
позже.
Однако многие вещи работают не так, как ожидалось.
Во-первых, при запуске приложения на iPad в портретном режиме (я использовал симулятор iPad Pro 11 дюймов) при запуске приложения экран не выбирается. Только после того, как я нажму Назад на панели навигации, отобразится начальный экран и отобразится мой домашний экран.
Вторая странность заключается в том, что привязка устанавливается на nil
всякий раз, когда боковая панель скрывается. В ландшафтном режиме вид работает должным образом, однако при переключении боковой панели на скрытие и последующее отображение выбор теряется. Вид содержимого остается правильным, но выбор боковой панели теряется.
Это всего лишь SwiftUI
ошибки или есть другой способ создать боковую панель с Binding
?