我在SwiftUI示例中有以下流程,非常方便。它基本上检查UserDefaults
中的一个标志,看之前是否显示过介绍视图,并根据它加载ContentView
或IntroView
。一旦显示了IntroView
,用户点击IntroView
,它会自动切换回ContentView
。这是SwiftUI中的一个很好的功能,其中App
结构体会观察bool并重新计算WindowGroup
。
问题:我有一个基于故事板的现有UIKit应用程序,我正在使用UIHostingController
慢慢地将SwiftUI视图注入其中。但我并没有真正获得SwiftUI应用程序生命周期的好处,就像上面一样,它变得很麻烦。例如,在显示IntroView
之后,我可能需要显示另一个视图,如PermissionsView
,在那里我要求相机和照片库权限,用户可以随时在iOS设置中更改。在SwiftUI中,下面的代码会自动监视任何更改并弹出IntroView
或PermissionsView
。我如何在基于UIKit
的应用程序中做到这一点?是否可以将UIApplicationDelegate
和SceneDelegate
代码迁移到SwiftUI App
,同时仍然从Storyboard加载视图控制器?
@main
struct TestSwiftUIIntroViewsApp: App {
@AppStorage("showedIntroView") var showedIntroView: Bool = false
var body: some Scene {
WindowGroup {
if showedIntroView {
ContentView()
} else {
IntroView()
}
}
}
}
struct ContentView: View {
var body: some View {
VStack {
Text("Content View")
}
.padding()
}
}
struct IntroView: View {
@AppStorage("showedIntroView") var showedIntroView: Bool = false
var body: some View {
VStack(alignment: .center, content: {
Text("Intro View")
})
.onTapGesture {
showedIntroView = true
}
}
字符串
}
1条答案
按热度按时间hm2xizp91#
我不知道我是否正确,但是是的,你可以加载故事板视图或任何UIViewController视图,这样做:
字符串
然后你可以像使用SwiftUI视图一样使用上面的代码:
型
另外,我不知道你的应用有多老,但对我来说似乎很新,但在SwiftUI应用中使用AppDelegate(甚至在SceneDelegate之前)是常见的做法。如果你想在SwiftUI应用中使用AppDelegate或现有的AppDelegate,你可以在SwiftUI项目中将其声明为符合App的结构体,如下所示:
型
它应该像在UIKit中一样工作。我希望我至少能部分地帮助你。祝你编码愉快!