J'ai cette application qui utilise le nouveau la touche latérale Introduite dans iOS14 pour iPad OS, mais je ne peux pas comprendre pourquoi il ne se souvient pas de l'état quand sa cachée
C'est la structure latérale
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())
}
}
pour marquer les éléments que j'utilise une structure personnalisée appelée navigationtem
enum NavigationItem {
case agenda
case calendar
case ...
}
et voici ici où j'ai placé la barre latérale dans la vue du contenu, comme vous pouvez le constater si le périphérique est un iPad (détecté à l'aide de sizeclasses), j'utilise la barre latérale, sinon si son iphone j'utilise la barre d'onglets
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)
pour la liaison de sélection est uniquement MacOS. Voir ce commentaire dans l'en-tête:
/// On iOS and tvOS, you must explicitly put the list into edit mode for
/// the selection to apply.
En tant que solution de contournement, vous pouvez rendre la ligne précédemment sélectionnée apparaît audacieuses, par ex.
NavigationLink(
destination: HomeView(),
tag: Screen.home,
selection: $selection,
label: {
Label("Home", systemImage: "house" )
})
.font(Font.headline.weight(selection == Screen.home ? .bold : .regular))
Pour plus, voir cela Réponse .