UIViewController:[super init]调用[self initWithNibName bundle:]

Sto*_*ker 5 objective-c xib uiviewcontroller ios

我的UIViewController子类中有两个init函数:

- (id)init
{
    self = [super init];
    if (self)
    { 
           // Custom stuff
        return self;
    }
    return nil;
}
Run Code Online (Sandbox Code Playgroud)

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName: nibNameOrNil 
                           bundle: nibBundleOrNil];
    if (self) 
    {
        // Custom stuff
    }
    return self;
}
Run Code Online (Sandbox Code Playgroud)

我将init函数放入以避免调用initWithNibName:bundle:方法.我试图尝试取出xib文件.不幸的是,调用这个init [[Myclass alloc] init]调用initWithNibName:bundle:通过调用[super init].

首先,我应该在文档中的哪个位置读取,以便我希望调用父init方法来调用我自己的initWithNibName:bundle:方法?

其次,这对Apple来说是一个很好的设计选择.我不明白为什么这是可取的行为?(这可能是因为我没有在这里得到大图,所以请随时告诉我.)

第三,我如何最好地解决它.我只是从我的代码中取出initWithNibName:bundle:从来没有一种情况我希望选择使用xib或类的手动实例化.

Eim*_*tas 6

通常我必须使用托管对象上下文初始化我的视图控制器.我实现了简单的-(id)initWithContext:方法,我称之为super的initWithNibName:bundle:方法.这样我就可以定义自己的xib名称.

你不确定问题的第一部分(阅读的东西,但是),但是用于VC的Apple的类模板表明他们有自己的initWithNibName:bundle方法,它们使用相同的参数调用super.因此,根据您的情况,我会说这确实是指定的初始化程序,并且调用简单init方法在super上调用它并不"安全" initWithNibName:bundle.我相信UIViewController的init看起来像这样:

- (id)init
{
  self = [self initWithNibName:nibNameDerivedFromClass bundle:probablyNilOrMainBundle];

  if (!self) return nil;

  // some extra initialization

  return self;
}
Run Code Online (Sandbox Code Playgroud)

由于超级类没有initWithNibName:bundle它必须自己调用方法使其成为指定的初始化器.由于你已经覆盖了它,ObjC的运行时会self在你的类中替换该方法.


小智 -3

您可以自定义视图并在 viewDidLoad 方法中添加子视图。在此方法中,您可以通过检查属性 nibName 来检查该类是使用 init 创建的还是使用 initWithNibName:bundle: 创建的。使用 init 时,nibName 将为 nil。

- (void)viewDidLoad
{
    [super viewDidLoad];
    if (!self.nibName) {
        // View was not loaded from nib - setup view
    }
}
Run Code Online (Sandbox Code Playgroud)