2013-06-28 62 views
1

我有一个自定义的容器视图控制器,我从故事板实例化,并且有一堆方法修改了我从storyboard设置插座的子视图的内容。ViewController之前被调用的自定义init方法viewDidLoad

有很多方法可以实例化这个ViewController,目前我必须确保,但是我实例化它,在开始之前我要么显示它,明确地调用loadView,要么访问它的.view属性任何使用其出口的东西(因为它们都是空指针,直到调用loadView)。

理想情况下,我想提出一个电话loadView.viewViewController单一初始化器的方法来解决这个问题,而不是把呼叫.view在一堆不同的地方,我的初始化ViewController来自。

UIViewController类是否有指定的初始化程序?如果没有,我需要使用我的自定义初始化逻辑修改哪些方法,以确保在我的ViewController初始化时调用它,而不管它是什么?

+0

UIViewController文档明确指出'loadView'不应该直接调用。 –

+0

@MartinR是的,Xcode的警告还明确指出属性获取器不应该用于副作用。尽管如此,如果你想在显示ViewController之前通过网点进行子视图操作并导致调用“loadView”,那么除了使用这两种禁止方法之外别无选择,除非我错过了另一种方法,哪种情况请在此提供:http://stackoverflow.com/a/1935566/1709587 –

回答

3

awakeFromNib似乎是一个合适的地方为您的目的。从文档:

在实例化过程,在存档的每个对象是 取消存档,然后用该方法适合它类型初始化。 使用它们的 initWithCoder:方法初始化符合NSCoding协议(包括所有 子类UIViewUIViewController)的对象。
...
已经被实例化并初始化所有对象后,在笔尖加载代码 重新建立所有这些 对象的出口和动作连接。然后它调用对象的方法awakeFromNib

+1

这里值得注意的是,在''ViewController''是的情况下,在被引用的文档中所做的保证是由'awakeFromNib'被调用时设置的出口变量设置的从故事板而不是'.nib'加载。见http://stackoverflow.com/questions/17400547/awakefromnib-outlets-and-storyboards-is-the-documentation-wrong和http://stackoverflow.com/questions/2723042/accessing-view-in-awakefromnib –

-1

可以覆盖这些覆盖在init情况:

- (id) initWithCoder:(NSCoder *)aDecoder 
{ 
    self = [super initWithCoder:aDecoder]; 
    if(self) 
    { 
     [self customInit]; 
    } 
    return self; 
} 

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 
{ 
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; 
    if (self) { 
     [self customInit]; 
    } 
    return self; 
} 

- (id)init 
    { 
     self = [super init]; 
     if (self) { 
      [self customInit]; 
     } 
     return self; 
    } 

- (void) customInit 
{ 
    //custom init code 
} 

然而,这并不是很好的做法,你应该做你的子视图操纵viewDidLoad中。

+0

谢谢。我实际上只是自己想到了这一点 - 我可能应该在询问之前做更多的研究 - 但是:1)我不打算在初始化程序中进行任何子视图操作;正如我所解释的那样,我只是想调用''self loadView'',以便子视图被加载并且出口不为空。 2)当'ViewController'通过'[Storyboard instantiateViewControllerWithIdentifier]'实例化'时,调用'initWithCoder'中的'[self loadView]'会抛出一个NSInternalInconsistencyException异常。 -1,因为这不处理我要求的用例。 –

+0

@MarkAmery:这里真的需要downvote吗?你询问了指定的初始化程序,并得到了答案。你不能指望foggzilla创建一个测试项目来检查''self loadView]'是否在initWithCoder中工作。 - 其实我现在犹豫了,给出了一个替代答案,因为如果它在你的用例中不起作用,你会低估它... –

+0

@MartinR我在问题中提供了用例。我当然不认为foggzilla可以预测到我在尝试使用'initWithCoder'而未经测试时遇到的问题,如果我处于他的位置,我可能会得到完全相同的答案 - 我很感激他帮帮我。尽管如此,这不是目前所说的问题的正确答案,所以我必须得到-1。 –

相关问题