我想使用SwiftUI构建一个非常简单的iOS 14侧边栏。设置相当简单,我有三个视图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}}创建侧边栏?