【问题标题】:How to have a List in SwiftUI able to point to multiple views based upon the row如何让 SwiftUI 中的列表能够根据行指向多个视图
【发布时间】:2019-08-06 03:21:20
【问题描述】:

表达这一点的一种简单方法是返回 UITableView 并拥有一个行为如下的didSelectRowAt(indexPath) 函数:

if (indexPath.row == 0) { ... } else { ... }

根据 indexPath.row 的值,我可以调用一个唯一的视图控制器(例如:第一个是 TableView,其他的是 CollectionViews。

目前,根据到目前为止的两个答案,我可以生成以下代码:

import SwiftUI

struct MenuItem {
    let title: String
    let isEnabled: Bool
}

struct HomeList: View {
    let menuItems = [
        MenuItem(title: "ABC", isEnabled: true),
        MenuItem(title: "DEF", isEnabled: false),
        MenuItem(title: "GHI", isEnabled: true)
    ]

    var body: some View {
        NavigationView {
            List {
                ForEach(menuItems.indices, id: \.self) { index in
                    NavigationLink(destination: menuItems[index].title == "ABC" ?
                        FirstList() :
                        SecondView(menuItem: menuItems[index])) {
                        HomeRow(menuItem: menuItems[index])
                    }
                }
            }
        }
    }
}

struct HomeRow: View {
    var menuItem: MenuItem

    var body: some View {
        HStack {
            Text(verbatim: menuItem.title)
        }
    }
}

struct FirstList: View {
    var body: some View {
            List(1 ..< 5) { index in
                Text("Row \(index)")
            }
            .listStyle(GroupedListStyle())
    }
}

struct SecondView: View {
    var menuItem: MenuItem

    var body: some View {
        Text(menuItem.title)
    }
}

但是,我的 NavigationLink 出现以下错误:

'? 中的结果值:' 表达式的类型不匹配 'FirstList' 和“第二视图”

由于我的目标是根据标题提出两种不同的观点,因此我想找到一些方法来实现这一目标。

superpuccio 发布的答案似乎与我想要的非常接近,但考虑到目标视图的预期复杂性,我认为完全在 NavigationLink 中组合它们是不可行的。

【问题讨论】:

    标签: swiftui ios13 navigationlink ios-navigationview


    【解决方案1】:

    由于您有一个动态的List,我建议您在List 中使用ForEach,这样:

    import SwiftUI
    
    struct MenuItem {
        let title: String
        let isEnabled: Bool
    }
    
    struct HomeList: View {
        let menuItems = [
            MenuItem(title: "ABC", isEnabled: true),
            MenuItem(title: "DEF", isEnabled: false),
            MenuItem(title: "GHI", isEnabled: true)
        ]
    
        var body: some View {
            let firstRowModel = menuItems[0]
            let actualModel = menuItems[1...menuItems.count-1]
    
            return NavigationView {
                List {
                    NavigationLink(destination: FirstList()) {
                        HomeRow(menuItem: firstRowModel)
                    }
                    ForEach(actualModel.indices, id: \.self) { index in
                        NavigationLink(destination: SecondView(menuItem: actualModel[index])) {
                            HomeRow(menuItem: actualModel[index])
                        }
                    }
                }
            }
        }
    }
    
    struct HomeRow: View {
        var menuItem: MenuItem
    
        var body: some View {
            HStack {
                Text(verbatim: menuItem.title)
            }
        }
    }
    
    struct FirstList: View {
        var body: some View {
                List(1 ..< 5) { index in
                    Text("Row \(index)")
                }
                .listStyle(GroupedListStyle())
        }
    }
    
    struct SecondView: View {
        var menuItem: MenuItem
    
        var body: some View {
            Text(menuItem.title)
        }
    }
    

    【讨论】:

    • 使用你的代码,我可以得到一个基本的概念,但是当我尝试将它扩展到我最终需要的东西时,我遇到了一个错误。我已经用足够的代码更新了这个问题,希望能传达我想要完成的目标。
    • @CodeBender 看看我的编辑,如果有帮助请告诉我。
    【解决方案2】:

    我会在目的地中包含条件。

    var body: some View {
            NavigationView {
                List(1 ..< 5) { idx in
                    NavigationLink(destination:
                        idx < 3 ? Text("1111") : Text("2222") ) {
                        Text("Row \(idx)")
                    }
    
                }
                .listStyle(GroupedListStyle())
    
            }
        }
    

    【讨论】:

    • 我更新了我的问题,对命名和 HomeRow 初始化程序进行了一些更改,并显示了 HomeMenuItem 结构。但是,在您使用 idx &lt; 3 ? ... 的地方,我尝试访问 mymenuItem 结构的属性失败并且只提供 _self
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-22
    • 1970-01-01
    • 2015-09-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多