我有一个应用程序,它使用在iPad os中引入的新的侧边栏,但我无法弄清楚为什么当隐藏时它不会记住状态。
这是侧边栏结构
import SwiftUI
struct Sidebar: View {
@Environment(\.managedObjectContext) var moc
@Binding var selection : Set<NavigationItem>
var body: some View {
List(selection: $selection) {
NavigationLink(destination: AgendaView().environment(\.managedObjectContext, moc).navigationTitle("Agenda"), label: {
Label("Agenda", systemImage: "book")
})
.tag(NavigationItem.agenda)
NavigationLink(destination: Text("Subjects"), label: {
Label("Materie", systemImage: "tray.full")
})
.tag(NavigationItem.subjects)
NavigationLink(destination: Text("Calendario"), label: {
Label("Calendario", systemImage: "calendar")
})
.tag(NavigationItem.calendar)
NavigationLink(destination: SettingsView().environment(\.managedObjectContext, moc).navigationTitle("Impostazioni"), label: {
Label("Impostazioni", systemImage: "gear")
})
.tag(NavigationItem.settings)
}
.listStyle(SidebarListStyle())
}
}
为了标记元素,我使用一个自定义结构体称为NavigationItem
enum NavigationItem {
case agenda
case calendar
case ...
}
这里是我在内容视图中放置侧边栏的位置,在这里你可以看到,如果设备是iPad(使用sizeClasses检测),我使用侧边栏;否则,如果是iPhone,我使用选项卡栏。
import SwiftUI
struct ContentView: View {
@Environment(\.horizontalSizeClass) var horizontalSizeClass
@Environment(\.managedObjectContext) var moc
@State private var selection : Set<NavigationItem> = [.agenda]
@ViewBuilder
var body: some View {
if horizontalSizeClass == .compact {
TabBar(selection: $selection)
.environment(\.managedObjectContext, moc)
} else {
NavigationView {
Sidebar(selection: $selection)
.environment(\.managedObjectContext, moc)
.navigationTitle("Menu")
}
}
}
}
NavigationItem
的自定义枚举,正如您从我的代码 @State private var section ... 中所看到的。我将其复制了苹果 WWDC20 Fruta 应用程序中的设置侧边栏默认状态的方法,但是这并没有起作用,因为当我启动应用程序时没有任何选定的内容,希望苹果能够解决这个问题! - Luca