【问题标题】:Private func didFinishLaunchingWithOptions not being called? (Swift 3)私有函数 didFinishLaunchingWithOptions 没有被调用? (斯威夫特 3)
【发布时间】:2016-10-06 06:02:17
【问题描述】:

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

【问题讨论】:

    标签: ios swift xcode launch


    【解决方案1】:

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

    我还有一个问题是我在 AppDelegate 中的 didFinishLaunchingWithOptions 方法不会被调用。我的函数也被标记为私有,看起来像这样

    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
    

    斯威夫特 4.2:

    func application( _ application: UIApplication,didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool
    

    【讨论】:

    • 对不起,我实际上已经解决了这个问题。忘记将此问题标记为已回答。要解决这个问题,我只需要将AnyObject 替换为Any 作为此方法的字典参数的值。很奇怪,你仍然可以在 Swift 3 中调用 AnyObject,即使该类已重命名为 Any 并且已完全弃用。但是还有一些其他这类类的例子,AnyObject 不是唯一的。
    • 这正是我想说的。方法签名从 AnyObject 更改为 Any,因此您使用 AnyObject 的方法未被识别为“didFinishLaunching”方法
    • 转换失败导致这个函数没有被调用,真是太疯狂了......
    • @Yannick AnyObject 尚未重命名为 Any,它们都已经存在。不同的是,AnyObject 只引用对象,而 Any 可以引用任何东西,包括对象、结构、枚举等。另外,值得一提的是,AnyObject 不是类,而是协议。尽管转换不应该失败,但它没有被调用的事实是正常的。 Swift 将每个函数的类型(参数和返回值)编码到二进制的符号中,这允许它进行函数重载。通常,这实际上是一件好事。 ;)
    • 为什么 Xcode 不抱怨过时的签名是我无法理解的。
    【解决方案2】:

    对于 Swift ~3.0 将 didFinishLaunchingWithOptions 替换为 以下签名

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

    【讨论】:

      【解决方案3】:

      您是否在您的ViewControllers 之一中实现了didFinishLaunchingWithOptions?不会调用此方法的自定义实现。此方法在ApplicationDelegate 中定义,并且在应用程序启动后始终会被调用。如果您还没有在任何ViewController 中再次定义该方法并且AppDelegate 中的方法没有被调用,请尝试重置模拟器。来自模拟器菜单Simulator -> Reset content and settings

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

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

      【讨论】:

      • 尝试重置内容和设置,没有成功。不,我没有在其他任何地方实现该方法,我知道那没用,因为它是一个委托方法。我仍然假设它与我在方法调用前摆脱 private 时收到的警告有关。或者至少可能是private 语句导致该方法在运行时被忽略?
      【解决方案4】:

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

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

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

      【讨论】:

        【解决方案5】:

        Swift 4.2 更新:

        func application(
            _ application: UIApplication, 
            didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
        ) -> Bool
        

        【讨论】:

          【解决方案6】:

          从设备中删除应用并重新启动 Xcode 对我有用

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2017-03-24
            • 1970-01-01
            • 1970-01-01
            • 2017-02-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-07-22
            相关资源
            最近更新 更多