SwiftUI侧边栏无法记住状态

18

我有一个应用程序,它使用在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")
            }
        }
    }
}

2
苹果公司的WWDC示例项目也存在这个bug。我已经提交了一个radar,你也应该提交一个。但是,如果有从侧边栏转换为TabView的解决方法就太好了。 - jlsiewert
1
是的,我看到Fruta应用程序也有同样的“bug”,如果苹果发现这个问题,希望能尽快修复。 - Luca
顺便问一下,如何设置默认选择的内容?我正在使用默认版本的侧边栏,初始状态没有任何选中项。 - Ryan
对于默认选定的项目,我使用一个名为 NavigationItem 的自定义枚举,正如您从我的代码 @State private var section ... 中所看到的。我将其复制了苹果 WWDC20 Fruta 应用程序中的设置侧边栏默认状态的方法,但是这并没有起作用,因为当我启动应用程序时没有任何选定的内容,希望苹果能够解决这个问题! - Luca
1
你找到解决方案了吗? - aheze
不好意思,问题仍然存在(顺便说一下,我还在使用iOS14)。 - Luca
2个回答

1

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

更多信息请查看此 答案

0

如果您的侧边栏不需要能够选择多行,请将 selection 的定义更改为:

@Binding var selection: NavigationItem?

注意:如果您想在TabView中使用相同的selection变量,那是不起作用的。您需要定义另一个不是可选项的NavigationItem属性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接