我有一个使用Main.sotyboard用Xcode 10制作的应用程序,想将其迁移到使用Apple的新框架:SwiftUI。
已经可以了吗?
我已经尝试在UIApplicationSceneManifest
中添加Info.plist
键,我将AppDelegate.swift
更改为使用场景,创建了SceneDelegate.swift
,即使这样我也不能< / p>
答案 0 :(得分:4)
我假设您正在使用Xcode 11 Beta
和macOS Mojave
或Catalina
。
随着plist
中的更改,您必须在应用程序委托中添加UISceneSession
生命周期函数。
func application(_ application: UIApplication,
configurationForConnecting connectingSceneSession: UISceneSession,
options: UIScene.ConnectionOptions) -> UISceneConfiguration {
// The name must match the one in the Info.plist
return UISceneConfiguration(name: "Default Configuration", sessionRole: connectingSceneSession.role)
}
func application(_ application: UIApplication, didDiscardSceneSessions sceneSessions: Set<UISceneSession>) {
}
此外,您需要确保在window
中正确创建了SceneDelegate
。
func scene(_ scene: UIScene,
willConnectTo session: UISceneSession,
options connectionOptions: UIScene.ConnectionOptions) {
let window = UIWindow(frame: UIScreen.main.bounds)
window.rootViewController = UIHostingController(rootView: ContentView())
self.window = window
window.makeKeyAndVisible()
}
其中ContentView
是您要显示的主要SwiftUI
视图。
P.S。确保plist
指定$(PRODUCT_MODULE_NAME).SceneDelegate
作为委托类名称,并且场景委托称为SceneDelegate
示例:
如果您使用的是Catalina
,则可以在目标的构建设置中启用Previews
。
构建选项->启用预览
附录I :
确保从信息列表中删除 Storyboard 键和该you're targeting iOS 13
。
附录II :
清理Derived Data
,正如评论中的许多开发人员所建议的那样。
答案 1 :(得分:2)
这是一个正确的小改动
在SceneDelegate.swift
中替换
let window = UIWindow(frame: UIScreen.main.bounds)
window.rootViewController = UIHostingController(rootView: ContentView())
self.window = window
window.makeKeyAndVisible()
使用
if let windowScene = scene as? UIWindowScene {
let window = UIWindow(windowScene: windowScene)
window.rootViewController = UIHostingController(rootView: ContentView())
self.window = window
window.makeKeyAndVisible()
}
来自HERE
答案 2 :(得分:0)
我的解决方案却有所不同。就我而言,我已经准备就绪,但是当代码尝试加载UISceneConfiguration
时,它无法加载Info.plist
中的配置,并给了我一个辅助窗口配置,而没有设置场景委托。如果我从调试控制台要求正确的配置,它将按预期加载。我很困惑。
我仔细检查了所有内容,并在这里尝试了所有建议,但没有一个起作用。最后,我在模拟器上做了'硬件'-'擦除所有内容和设置...',就解决了它。
我的猜测是,因为我一直在模拟器上运行该应用程序的SWIFTUI之前版本,所以其中的某些原因导致SwiftUI版本的行为有所不同。