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

How can I launch a SwiftUI View without Navigation back tracking?

提问人:J. Edgell 提问时间:6/16/2019 更新时间:6/7/2020 访问量:2875

问:

我想将 View 作为没有导航层次结构的独立视图启动。我不想使用 NavigationButton 的原因是我不想让用户返回到调用窗体。

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

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

我有正当理由不使用导航 UI,为了保持简短,我省略了解释。我避免使用故事板,以使其尽可能简单。

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

SWIFTUI的

评论

0赞 Fogmeister 6/16/2019
这是用于登录屏幕吗?还是类似的东西?
0赞 RPatel99 6/16/2019
如果你只是不想去导航路线,因为你不想让用户能够回去,你可以直接禁用导航栏的后退按钮,甚至完全隐藏导航栏。
0赞 J. Edgell 6/16/2019
@Fogmeister 是的,它用于登录屏幕。我刚刚发现这在模拟器中有效,但在 Canvas 中不起作用,这非常有意义!我将把这个问题搁置一会儿,看看是否有人有更好的方法。
0赞 Fogmeister 6/16/2019
在那种情况下...你不应该像这样过渡。你真的应该用一个新的屏幕替换整个屏幕。使用 EnvironmentObject,例如,根据该状态更新视图以显示登录屏幕或应用程序屏幕。userLoggedIn
0赞 Fogmeister 6/16/2019
看看我的答案 这里...stackoverflow.com/questions/56557979/......

答:

0赞 J. Edgell 6/16/2019 #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)
}

评论

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