Sto*_*ker 5 objective-c xib uiviewcontroller ios
我的UIViewController子类中有两个init函数:
- (id)init
{
    self = [super init];
    if (self)
    { 
           // Custom stuff
        return self;
    }
    return nil;
}
和
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName: nibNameOrNil 
                           bundle: nibBundleOrNil];
    if (self) 
    {
        // Custom stuff
    }
    return self;
}
我将init函数放入以避免调用initWithNibName:bundle:方法.我试图尝试取出xib文件.不幸的是,调用这个init [[Myclass alloc] init]调用initWithNibName:bundle:通过调用[super init].
首先,我应该在文档中的哪个位置读取,以便我希望调用父init方法来调用我自己的initWithNibName:bundle:方法?
其次,这对Apple来说是一个很好的设计选择.我不明白为什么这是可取的行为?(这可能是因为我没有在这里得到大图,所以请随时告诉我.)
第三,我如何最好地解决它.我只是从我的代码中取出initWithNibName:bundle:从来没有一种情况我希望选择使用xib或类的手动实例化.
通常我必须使用托管对象上下文初始化我的视图控制器.我实现了简单的-(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;
}
由于超级类没有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
    }
}
| 归档时间: | 
 | 
| 查看次数: | 7872 次 | 
| 最近记录: |