SwiftUI:登录完成后导航到主屏幕。通过按钮单击导航视图。

6

我正在设计一个登录页面。在点击登录按钮后,我将对API进行调用,并将用户重定向到主页。

问题:如何通过按钮单击执行某些操作并导航到另一个视图?

我尝试了这个链接:Programatically navigate to new view in SwiftUI

但是我遇到了以下错误:

"Function declares an opaque return type, but has no return statements in its body from which to infer an underlying type"

请帮我解决问题。

2个回答

5

目前某个视图存在问题(希望会很快修复)。

为了使用发布的代码,你需要编写类似以下的内容:

struct ContentView: View {

    @EnvironmentObject var userAuth: UserAuth 

    @ViewBuilder
    var body: some View {
        if !userAuth.isLoggedin {
            return LoginView()
        } else {
            return NextView()
        }
    }
}

就目前我所知,这是唯一对我有效的方法——适用于正文和组。

供未来参考:日期2019年10月24日。


你如何注销(从NextView返回到LoginView),我尝试将“isLoggedIn”更改为false,但这并不起作用。 - Ahmed Sarfraz
1
请确保您拥有相同的对象 - 如果您创建一个新对象,它只会在该屏幕上起作用。 - Miknash
1
这对于同步的isLoggedIn来说是可以的,但如果调用登录是异步的,我想知道该怎么做。 - alionthego

2

或者可以查看SceneDelgate.swift,在那里您可以将关键窗口的根视图设置为任何您想要的。

在您的情况下,当成功登录时,您可以向SceneDelegate发出状态更改的信号(例如通过通知)。然后,让应用程序将根视图控制器设置为主视图(作为UIHostingController)。

例如:

在您的SceneDelegate类中添加: var currentScene:UIScene?//需要保留引用

然后在func scene(_ scene:UIScene,willConnectTo session:UISceneSession,options connectionOptions:UIScene.ConnectionOptions)内部

保存对上面声明的变量中场景的引用。

self.currentScene = scene

接下来,在您要使用新视图更改关键窗口时添加侦听器:

 var keyWindow: UIWindow?

 NotificationCenter.default.addObserver(forName: .newUser, object: nil, queue: .main) { [weak self] (notification) in

      guard let windowScene = self?.currentScene as? UIWindowScene else { return }

      keyWindow = UIWindow(windowScene: windowScene)
      keyWindow?.rootViewController = UIHostingController(rootView: Text("hello"))
      keyWindow?.makeKeyAndVisible()

    }

只需将通知设置为在需要时发布,并将 Text 替换为您想要的任何视图。


这似乎是我在项目中想要做的事情,但我不确定你把通知观察者放在哪里? - eResourcesInc
1
SceneDelegate对象本身是一种选择。只需重写初始化程序以设置观察和在userInfo中设置下一个视图(或某个标识符)即可。或者,无需通知,直接在SceneDelegate的新函数中设置rootView并访问共享对象,如:(UIApplication.shared.connectedScenes.first?.delegate as? SceneDelegate) - Cenk Bilgen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接