web-dev-qa-db-fra.com

La barre latérale SWIFTUI ne se souvient pas d'état

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")
            }
        }
    }
}
12
Luca

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 .

1
malhal