web-dev-qa-db-ja.com

Swiftui SideBarは状態を覚えていません

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

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))
 _

これを参照してください。 回答

1
malhal