IPad OSのiOS14で導入されたnewサイドバーを使用するこのアプリは、その州を覚えていない理由を理解することはできません。隠れた
これはサイドバーの構造体です
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を使用して検出された)私がサイドバーを使用しているかどうかがわかります。
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")
}
}
}
}
_
List(selection: $selection)
選択バインディングの場合はMacOSのみです。ヘッダーでこのコメントを参照してください。
/// On iOS and tvOS, you must explicitly put the list into edit mode for
/// the selection to apply.
_
回避策として、以前に選択された行を太字にすることができます。
NavigationLink(
destination: HomeView(),
tag: Screen.home,
selection: $selection,
label: {
Label("Home", systemImage: "house" )
})
.font(Font.headline.weight(selection == Screen.home ? .bold : .regular))
_
これを参照してください。 回答 。