【问题标题】:viewControllers initialized *before* application didFinishLaunchingviewControllers 初始化 *before* 应用程序 didFinishLaunching
【发布时间】:2012-08-07 17:13:41
【问题描述】:

我发现我的一些视图控制器的 initWithCoder 方法在应用程序委托中的应用程序 didFinishLaunching 方法之前被调用。 (我已经通过设置断点并查看调用顺序确认了这一点)

我正在使用故事板。 UITabBarController 是初始视图控制器。部分问题在于情节提要以未知的顺序创建对象;也许它是在应用启动之前创建视图控制器。

无论如何,问题在于我正在注册初始用户默认值。这必须在程序的任何部分查看它们之前发生。所以,我试图找到保证注册代码首先执行的位置。

有这样的地方吗?

注意: 这个帖子讨论了一点,但没有真正的结论......

ViewDidLoad runs before AppDelegate didFinishLaunchingWithOptions gets executed!

【问题讨论】:

  • 我知道您是 StackOverFlow 的新手,而且您知道 - 如果您通过点击复选标记选择他们的答案,它会帮助帮助您的人 - 如果您真的喜欢答案,您可以点击在“答案”下的向上箭头上。这都是自愿的,如果你不这样做,什么都不会发生。但是你会得到一个“接受”的评分,即你选择答案的百分比,这个数字越高,将来帮助你的人就越多。

标签: ios uiviewcontroller uiapplicationdelegate


【解决方案1】:

初始化用户默认值的标准方法是在您的应用委托中使用“+(void)initialize”方法:

+ (void)initialize
{
    if(self == [MyAppDelegate class]) {
        ...
    }
}

这保证在任何委托方法收到消息之前运行。

PS:在从该方法返回之前,我在 didLaunch 方法中实例化了一大堆 viewController。

【讨论】:

  • 完美——这正是我想要的。谢谢!
  • 这是在加载根视图控制器之前运行的吗?
  • 是的 - 在任何实例收到消息之前,运行时都会调用初始化。所以必须在 applicationDidLaunch... 和好友之前发送。
【解决方案2】:

这是很自然的(也是使用 InterfaceBuilder 很糟糕的原因之一)。在 application:didFinishLaunchingWithOptions: 中,您通常依赖已经从相应的 NIB/XIB 文件创建的主窗口和主视图控制器。两种解决方案:

一个(首选):在 application:didFinishLaunchingWithOptions: 中手动实例化东西。因此,您可以控制任何初始化的执行顺序。

二:使用__attribute__((constructor(XXX)))函数——它们保证在main之前被调用,并且XXX数字越小,特定的构造函数被调用得越早。然而,这种方法是不可取的,因为它不是标准的 C(只是一个编译器扩展),而且它也很容易变得非常混乱。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-08
    • 2016-04-26
    • 1970-01-01
    • 2011-11-17
    • 2011-03-06
    • 2011-01-26
    • 2015-04-29
    相关资源
    最近更新 更多