对于新的SwiftUI
iOS应用程序,我在SceneDelegate
中执行以下操作
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
if Auth().token == nil {
window.rootViewController = UIHostingController(rootView: StartRegistrationView())
} else {
window.rootViewController = UIHostingController(rootView: MainTabbedView())
}
self.window = window
window.makeKeyAndVisible()
}
当用户尚未注册或登录时,他们将进入注册流程。
用户注册后,如何将RootView切换到我的TabView?我似乎找不到任何使用SwiftUI
的解决方案。
我应该改为使用Environment
对象并侦听用户Auth
状态的更改吗?
6条答案
按热度按时间ktca8awb1#
声明一个AppRootView,如下所示:
然后在SceneDelegate中将其设置为根视图:
第一个月
你必须将你的视图绑定到Auth(),要么像我上面那样传入它,要么在你的环境中设置它。SwiftUI的美妙之处在于,只要令牌不是nil,视图就会重新绘制,你的用户就会在MainTabbedView中找到自己。
7nbnzgx92#
通过使用这个,我们可以通过实现上面的代码来更改任何按钮单击中的rootView。
p1tboqfb3#
非常好的答案Lugaga,更新如果你不想使用@Observablebject,所以不会一直更新,你可以使用主题,只要你更新令牌字符串,RootView将更新.
zed5wv104#
您可以创建Router类
首先创建UIApplication的扩展
然后创建一个Router类并添加以下方法:
现在,您可以从代码中的任何位置调用它,例如从SceneDelegate:
或者不经过Windows
并且过渡将被动画化。
用法:
有了它,您就可以决定在任何给定的时间将哪个窗口作为根窗口。
46qrfjad5#
对于更改根视图时的某些动画,请使用sceneDelegate中的以下代码:
piztneat6#
在较新的Xcode中,SwiftUI模板有一些变化,下面是初始视图的加载方式。
在本例中,第一个视图是
WelcomeView
,此视图负责导航到正确的视图,可能是login、homeAuth是一个符合
ObservableObject
协议的类,它有一个被发布的属性token,所以当这个token有一个值时,它会在上面的例子中加载HomeView
,如果为nil,它会打开SignUpView
。如果你有API依赖性,需要等待令牌,那么你可以使用
WelcomeScreen
作为一些splash或动画,这种方法将很有帮助。