私有func didFinishLaunchingWithOptions没被调用? (斯威夫特3)

当应用程序第一次开始运行时,是不是应该调用didFinishLaunchingWithOptions ? 我在这个方法中设置了一个断点,当我在模拟器中运行应用程序时,断点不会被命中,这意味着该方法不会被调用。 我试图在应用程序启动时从UserDefaults加载一些数据,但它完全被忽略了。 我注意到的一件事是默认情况下它是一个private func而不是一个func 。 如果我摆脱private ,我收到一个警告,“UIApplicationDelegate中有一个几乎相似的可选要求”。 有人可以向我解释这意味着什么以及private func是否与被忽略的方法有关? 当我在模拟器中运行我的应用程序时,该方法是否应该被调用? 如果没有,我如何测试我的应用程序启动后是否正在检索数据? AppDelegate中的所有其他方法都会被正常调用(例如, applicationDidEnterBackground方法可以正常工作)。

删除您的方法签名并让Xcode自动完成它

我还遇到了didFinishLaunchingWithOptions方法无法调用的问题。 我的function也标记为私有,看起来像这样

 private func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool 

问题是这是旧的语法! 当我将项目从Swift 2.x转换为Swift 3时,显然对我来说,Xcode没有转换AppDelegate中的方法。 新语法如下所示

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool 

您是否在其中一个ViewControllers实现了didFinishLaunchingWithOptions ? 一个人不会调用此方法的自定义实现。 此方法在ApplicationDelegate定义,并且一旦启动ApplicationDelegate ,它将始终被调用。 如果您尚未在任何ViewController再次定义该方法,并且未调用AppDelegate方法,则尝试重置模拟器。 从模拟器菜单Simulator -> Reset content and settings

如果编译器提示将didFinishLaunchingWithOptions方法设为私有,则该方法的参数可能会导致错误。 应用程序的参数(_:didFinishLaunchingWithOptions :)委托方法现在桥接到Swift作为[UIApplicationLaunchOptionsKey:Any] ?,而不是[NSObject:AnyObject] ?. 因此,如图所示修改方法签名。

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool { // ... } 

for Swift~3.0用以下签名替换didFinishLaunchingWithOptions

 func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool { } 

此方法在ApplicationDelegate中定义,并且一旦启动应用程序,它将始终被调用。 如果您尚未在任何ViewController中再次定义该方法,并且未调用AppDelegate中的方法,则尝试重置模拟器。

打开模拟器 – >菜单模拟器 – >重置内容和设置。

 -(BOOL)application(UIApplication*)applicationdidFinishLaunchingWithOptions:(NSDictionary *)launchOptions { //.. }