在 Swift 5.0 中从 AppDelegate 实例化窗口失败 [重复]
Posted
技术标签:
【中文标题】在 Swift 5.0 中从 AppDelegate 实例化窗口失败 [重复]【英文标题】:Instantiating Window from AppDelegate Failing in Swift 5.0 [duplicate] 【发布时间】:2019-10-12 00:52:25 【问题描述】:我正在使用 Xcode 11 和 Swift 5.0。我从另一个使用 Swift 4.2 的应用程序中复制了我的代码。该代码在 AppDelegate 中实例化一个 tabBarViewController,将窗口更改为 tabBarVC,并在满足某些条件时显示它。但它不适用于 Swift 5.0 和 Xcode 11。代码如下:
var window: UIWindow?
func application(_ application: UIApplication, willFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey : Any]? = nil) -> Bool
// Run Firebase
FirebaseApp.configure()
// Check Firebase Auth to see if the user is signed in already.
if Auth.auth().currentUser != nil
print ("User is already authenticated and signed in.")
// Check to make sure the user is stored in local settings.
if let appUser = LocalStorageService.loadCurrentUser()
print ("Local storage has a user: \(appUser)")
// Create a tab bar controller.
let tabBarVC = UIStoryboard(name: "Main", bundle: .main).instantiateViewController(withIdentifier: Constants.Storyboard.tabBarController)
// Show it
window?.rootViewController = tabBarVC
window?.makeKeyAndVisible()
return true // If auth has a user and there is local user, window changes.
else
print ("No Authenticated current user, must proceed with Login.")
return false
tabBarVC 已成功填充,但 window 仍为 nil。然后应用程序显示不同的视图控制器。代码与我可以看到的原始应用程序没有什么不同。而那个仍然有效。想法将不胜感激。
【问题讨论】:
【参考方案1】:我从导航器中删除了SceneDelegate
,并从处理场景的info.plist
中删除了以下部分,现在它可以按预期工作(其他应用程序没有SceneDelegate
或info.plist
中的这些部分。我假设它们是在 Xcode 11 中创建项目时添加的):
我在 Apple 文档中了解了 ios 13 的场景。我不打算使用场景,但如果有人确实想使用场景,他们将必须确定如何配置 info.plist
以允许在 AppDelegate 中实例化 VC。
【讨论】:
如果您想使用场景,请查看由 Matt 标记的副本。该答案将窗口置于场景委托中。这个答案完全删除了场景委托。场景不是必需的。以上是关于在 Swift 5.0 中从 AppDelegate 实例化窗口失败 [重复]的主要内容,如果未能解决你的问题,请参考以下文章
在 Swift 中从 AppDelegate 解开 UIWindow 两次