首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使SwiftUI中的列表能够根据行指向多个视图

如何使SwiftUI中的列表能够根据行指向多个视图
EN

Stack Overflow用户
提问于 2019-08-06 03:21:20
回答 2查看 1.6K关注 0票数 0

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

代码语言:javascript
运行
复制
if (indexPath.row == 0) { ... } else { ... }

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

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

代码语言:javascript
运行
复制
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中组合它们是可行的。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-08-06 14:33:57

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

代码语言:javascript
运行
复制
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)
    }
}
票数 1
EN

Stack Overflow用户

发布于 2019-08-06 04:11:51

我会把条件包括在目的地。

代码语言:javascript
运行
复制
var body: some View {
        NavigationView {
            List(1 ..< 5) { idx in
                NavigationLink(destination:
                    idx < 3 ? Text("1111") : Text("2222") ) {
                    Text("Row \(idx)")
                }

            }
            .listStyle(GroupedListStyle())

        }
    }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57368488

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档