0

表达这一点的一种简单方法是回到 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' 和 'SecondView'

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

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

4

2 回答 2

1

由于您有动态,我建议您以这种方式List使用ForEach内部:List

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)
    }
}
于 2019-08-06T14:33:57.900 回答
1

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

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

            }
            .listStyle(GroupedListStyle())

        }
    }
于 2019-08-06T04:11:51.877 回答