2012-08-07 22 views
3

之前初始化*我已找到了一些我的看法控制器的initWithCoder方法在应用程序委托调用之前应用didFinishLaunching方法的情况。 (我已通过设置断点并查看调用顺序来确认此事)viewControllers *应用didFinishLaunching

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

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

有没有这样的地方?

注: 此线程讨论这一点,但不是一个真正的结论......

ViewDidLoad runs before AppDelegate didFinishLaunchingWithOptions gets executed!

+0

我看到你是StackOverFlow的新手,只是让你知道 - 如果你点击对号选择他们的答案,它可以帮助那些帮助你的人 - 如果你真的很喜欢答案,你可以点击下面的向上箭头“回答”。这都是自愿的,如果你不这样做,什么都不会发生。但是,您会得到“已接受”的评分,即您选择答案的问题的百分比,此数字越高,未来人们对您的帮助就越多。 – 2012-08-08 01:46:39

回答

4

初始化用户默认值的标准方法是在一个“+(无效)初始化”的方法在应用程序委托:

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

这是保证任何委托方法被传递消息之前运行。 PS:我在我的didLaunch方法中实例化了一大堆viewControllers,然后从该方法返回。

+0

完美 - 这正是我一直在寻找的。谢谢! – 2012-08-08 00:34:32

+0

这是否在加载根视图控制器之前运行? – jasongregori 2012-11-08 19:41:04

+0

是 - 在任何实例获取消息之前,初始化由运行时调用。所以它必须在applicationDidLaunch和朋友之前发送。 – 2012-11-09 01:11:42

0

这是自然的(以及为什么使用InterfaceBuilder的很烂的原因之一)。在应用程序中:didFinishLaunchingWithOptions:您通常依赖主窗口和主视图控制器,它们已经从相应的NIB/XIB文件创建。两种解决方案:

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

二:使用__attribute__((constructor(XXX)))函数 - 它们保证在main之前被调用,并且XXX号码越早被调用的特定构造函数。然而,这种方法不可取,因为它不是标准的C(只是一个编译器扩展),而且它也很容易让人感到困惑。