在 UISplitViewController 中使用 SwiftUI 列表侧边栏

Posted

技术标签:

【中文标题】在 UISplitViewController 中使用 SwiftUI 列表侧边栏【英文标题】:Using a SwiftUI List Sidebar in a UISplitViewController 【发布时间】:2021-02-13 23:18:33 【问题描述】:

我正在尝试构建我的应用程序的导航,以便我有一个 UISplitViewController(三列样式)和我使用 SwiftUI 构建的视图。我的主要侧边栏目前非常简单:

struct PrimarySidebarView: View 
    
    @EnvironmentObject var appModel: AppModel
    
    var body: some View 
        List(PrimarySidebarSelection.allCases, id: \.self, selection: $appModel.primarySidebarSelection)  selection in
            Text(selection.rawValue)
        
        .listStyle(SidebarListStyle())
        .navigationBarItems(trailing: EditButton())
    

其中 PrimarySidebarSelection 是一个枚举。我计划在另一个侧边栏中访问相同的 AppModel 环境对象,允许我根据主要选择更改补充侧边栏中显示的内容。我正在使用新的 SwiftUI App 生命周期,而不是 AppDelegate。

我想知道如何将选择样式从这里更改为 SwiftUI 的 NavigationView 中使用的典型侧边栏选择样式。根据SwiftUI's List Documentation,该选择仅在列表处于编辑模式时可用(并且选择显示每个项目旁边的圆圈,这是我不想要的,而是我希望该行像在 NavigationView 中一样在工作时突出显示与 NavigationLinks)。

提前致谢。

【问题讨论】:

【参考方案1】:
enum PrimarySidebarSelection: String, CaseIterable 
    case a,b,c,d,e,f,g

struct SharedSelection: View 
    @StateObject var appModel: AppModel = AppModel()
    var body: some View 
        NavigationView
            PrimarySidebarView().environmentObject(appModel)
            Text(appModel.primarySidebarSelection.rawValue)
        
    

class AppModel: ObservableObject 
    @Published var primarySidebarSelection: PrimarySidebarSelection = .a

struct PrimarySidebarView: View 
    
    @EnvironmentObject var appModel: AppModel
    
    var body: some View 
        List
            ForEach(PrimarySidebarSelection.allCases, id: \.self)  selection in
                Button(action: 
                    appModel.primarySidebarSelection = selection
                , label: 
                    HStack
                        Spacer()
                        Text(selection.rawValue)
                            .foregroundColor(selection == appModel.primarySidebarSelection ? .red : .blue)
                        Spacer()
                    
                
                )
                .listRowBackground(selection == appModel.primarySidebarSelection ? Color(UIColor.tertiarySystemBackground) : Color(UIColor.secondarySystemBackground))
            
            
        
        .listStyle(SidebarListStyle())
        .navigationBarItems(trailing: EditButton())
        
    

【讨论】:

我做了一些与此非常相似的事情,我只是希望能够拥有每个各自平台的默认侧边栏 UI,但我想这现在只能做。

以上是关于在 UISplitViewController 中使用 SwiftUI 列表侧边栏的主要内容,如果未能解决你的问题,请参考以下文章

UISplitViewController:在 detailView 中导航

在 UISplitViewController 中使用 SwiftUI 列表侧边栏

UISplitViewController:为啥我不应该在导航或标签栏界面中显示它?

UISplitViewController 一致分隔符

在 UISplitViewController 中隐藏 MasterView

嵌套详细视图(UISplitViewController)中缺少后退按钮