【问题标题】:Differences in a body of view in SwiftUISwiftUI 中视图主体的差异
【发布时间】:2020-04-14 12:54:59
【问题描述】:

我有一个菜单列表

let muscleEtfs = Menu(name:"MuscleETFs",  image:"image", destination: .muscleETFs)

let menus: [Menu] = [home, marketTrend, indexes, sectors, stockAnalysis, backtest, screener, myPortfolio, watchList, muscleStocks, muscleEtfs]

我的目标是有条件地更改 SwiftUI 中 NavigationLink 的目的地。任何人都可以向我解释为什么开关盒不起作用但如果起作用。

let muscleEtfs = Menu(name:"MuscleETFs",  image:"image", destination: .muscleETFs)

    var body: some View {
        let menus: [Menu] = [home, marketTrend, indexes, sectors, stockAnalysis, backtest, screener, myPortfolio, watchList, muscleStocks, muscleEtfs]

        return List {
            ForEach(menus) { menu in

                // This does not work
                switch menu.destination {
                case .news:
                    NavigationLink(
                            destination: HomeNewsView(menu: menu)
                    )
                    {
                        Text("\(menu.name)")
                    }
                default:
                    NavigationLink(
                            destination: HomeNewsView(menu: menu)
                    )
                    {
                        Text("\(menu.name)")
                    }

                }

                // This does
                if menu.destination == .news   {
                    NavigationLink(
                            destination: HomeNewsView(menu: menu)
                    )
                    {
                        Text("\(menu.name)")
                    }
                }
            }
        }

使用 switch 条件会在 Xcode 上引发编译错误

包含控制流语句的闭包不能与函数生成器“ViewBuilder”一起使用

【问题讨论】:

  • 返回视图的开关没有按照你想要的方式实现。您可以使用方法内部的逻辑或仅使用 if/else。
  • 谢谢。只有这样才能工作,而不是 View 或 AnyView 只有一些视图作为返回类型。

标签: xcode swiftui swiftui-navigationlink


【解决方案1】:

这行得通,记住返回类型 AnyView 或 View 将不起作用。

func destinationView(menu: Menu) -> 一些视图 {

        switch menu.destination {
        case .news:
            return NavigationLink(
                    destination: HomeNewsView(menu: menu)
            )
            {
                Text("\(menu.name)")
            }
        default:
            return NavigationLink(
                    destination: HomeNewsView(menu: menu)
            )
            {
                Text("\(menu.name)")
            }
        }

    }

【讨论】:

    猜你喜欢
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多