• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

ios - 使用 SwiftUI 在不同的 UI 层次结构之间切换的正确方法是什么?

[复制链接]
菜鸟教程小白 发表于 2022-12-12 15:12:42 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

想象一个典型的应用程序,它具有引导、登录/注册和某种内容。当应用程序加载时,您需要决定要显示哪个 View 。一个简单的实现可能如下所示:

struct ContentView: View {
    //assuming some centralized state that keeps track of basic user activity
    @State var applicationState = getApplicationState()

    var body: some View {

        if !applicationState.hasSeenOnboarding {
            return OnBoarding()
        }

        if !applicationState.isSignedIn {
            return Registration()
        }

        return MainContent()
    }
}

显然这种方法失败了,因为 SwiftUI View 需要 some View 的不透明返回类型。这可以使用 AnyView 包装器类型来缓解(尽管有点骇人听闻),它提供类型删除并允许编译下面的代码。

struct ContentView: View {
    //assuming some centralized state that keeps track of basic user activity
    @State var applicationState = getApplicationState()

    var body: some View {

        if !applicationState.hasSeenOnboarding {
            return AnyView(OnBoarding())
        }

        if !applicationState.isSignedIn {
            return AnyView(Registration())
        }

        return AnyView(MainContent())
    }
}

有没有更正确的方法不需要使用AnyViewSceneDelegate 中是否有可以处理转换到完全不同的 View 层次结构的功能?



Best Answer-推荐答案


可能最SwiftUI-y 的方式是使用Group View :

import SwiftUI

struct ContentView: View {
    @State private var applicationState = getApplicationState()

    var body: some View {
        Group {
            if !applicationState.hasSeenOnboarding {
                OnBoarding()
            } else if !applicationState.isSignedIn {
                Registration()
            } else {
                MainContent()
            }
        }
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

需要注意的最重要的一点是,这样一来,您就不会依赖 AnyView 的类型删除(如果不是绝对必要的话,可以避免)。

如果您想将初始 View 创建封装在一个方法中,请不要使用类型删除。相反,使用 some 关键字:

import SwiftUI

struct ContentView: View {
    @State private var applicationState = getApplicationState()

    private func initialView() -> some View {
        if !applicationState.hasSeenOnboarding {
            OnBoarding()
        } else if !applicationState.isSignedIn {
            Registration()
        } else {
            MainContent()
        }
    }

    var body: some View {
        initialView()
    }
}

struct ContentView_Previews: PreviewProvider {
    static var previews: some View {
        ContentView()
    }
}

关于ios - 使用 SwiftUI 在不同的 UI 层次结构之间切换的正确方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57780005/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap