如何在没有导航回溯的情况下启动 SwiftUI 视图?

Posted

技术标签:

【中文标题】如何在没有导航回溯的情况下启动 SwiftUI 视图?【英文标题】:How can I launch a SwiftUI View without Navigation back tracking? 【发布时间】:2019-06-15 18:37:28 【问题描述】:

我想将视图作为没有导航层次结构的独立视图启动。我不想使用 NavigationButton 的原因是我不希望用户返回调用表单。

我尝试了以下方法,类似于在 ScenceDelegate 中启动第一个视图的方式,但没有任何反应:

    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let window = appDelegate.getNewWindow()
    window.rootViewController = UIHostingController(rootView: NewView())
    window.makeKeyAndVisible()

我有正当理由不使用导航 UI,我将省略说明以保持简短。我避免使用情节提要,以使其尽可能简单。

感谢您提供任何解决方案建议。

【问题讨论】:

这是登录屏幕吗?或者类似的东西? 如果你只是不想去导航路线,因为你不希望用户能够返回,你可以禁用导航栏的返回按钮,甚至完全隐藏导航栏。 @Fogmeister 是的,它用于登录屏幕。我刚刚发现这在模拟器中有效,但在画布中无效,这很有意义!我将把这个问题留一会儿,看看是否有人有更好的方法。 在那种情况下......你不应该像这样过渡。您真的应该用新屏幕替换整个屏幕。使用像 userLoggedIn 这样的 EnvironmentObject 并根据状态更新视图以显示登录屏幕或您的应用屏幕。 在这里看看我的回答...***.com/questions/56557979/… 【参考方案1】:

这就是我完成加载新根视图的方式。

我在 AppDelegate 代码中添加了以下内容

@UIApplicationMain
class AppDelegate: UIResponder, UIApplicationDelegate 
     var window: UIWindow?

   ...

    func loadNewRootSwiftUIView(rootViewController: UIViewController)
    
        let window = UIWindow(frame: UIScreen.main.bounds)
        window.rootViewController = rootViewController
        self.window = window
        window.makeKeyAndVisible()
    

并在我的表单中放置以下内容:

struct LaunchView : View 
    var body: some View 
        VStack 
            Button(
                action: 
                   LaunchLoginView()
            ,
                label: 
                    Text("Login")
            
            )
        
    


func LaunchLoginView()
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let vContoller = UIHostingController(rootView: LoginView())
    appDelegate.loadNewRootSwiftUIView(rootViewController: vContoller)

【讨论】:

我已经用 SwiftUI Beta 5 试过这个。它编译但没有任何反应,即没有新窗口。这种方法在 Beta 5 中仍然有效吗?我是否需要以某种方式将其挂接到 SceneDelegate 中? 我正在使用 SwiftUI Beta 7 并遇到同样的问题。没发生什么事。有人知道如何处理这种情况吗? 这真是利用了SwiftUI的过渡状态; App Delegates 和 RootViewControllers 最终将被完全删除。而且,据我所知,Apple 并没有真正考虑在 SwiftUI 中进行全视图替换样式导航(例如,替换根视图控制器)的方法。这很糟糕!有条件地显示欢迎屏幕和登录屏幕或直接进入主屏幕不应该需要“单页应用程序”思维,正如 Fogmeister 上面所建议的那样(这是目前唯一的解决方法)。 :(

以上是关于如何在没有导航回溯的情况下启动 SwiftUI 视图?的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI在没有按钮的情况下询问通知权限

在 SwiftUI 中的多个导航视图的情况下隐藏导航栏

SwiftUI (1.0) 中的导航问题

如何在没有回溯的情况下退出 Python?

如何在 SwiftUI 中动态隐藏导航返回按钮

如何使用 SwiftUI 显示全栈模式?