【问题标题】:How to make subclass refer to XIB of its superclass?如何让子类引用其超类的XIB?
【发布时间】:2013-01-22 00:41:00
【问题描述】:

我有一个BaseClass UIViewController 类。它运作良好。 BaseClass 有 BaseClass.xib

然后我创建了该基类的子类。

结果没有连接任何插座。

我放了

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

是的,就是这样。它被称为。我不确定 aDecoder 是什么。我认为这是 childClass 的 XIB 的表示,它不存在。我想用super的xib初始化super。

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

永远不会被调用。

事实上,我自己也很困惑。当我们有 xib 时,似乎 -(id)initWithCoder:(NSCoder *)aDecoder 是被调用的那个。所以我想知道 initWithNibName 是干什么用的?

我试过了

- (id)initWithCoder:(NSCoder *)aDecoder
{
    self = [super initWithNibName:NSStringFromClass([super class]) bundle:nil];
    return self;
}

【问题讨论】:

  • 如何初始化视图控制器?使用UIViewControllerinitWithNibName:bundle:NSBundleloadNibNamed:owner:

标签: objective-c xcode4.5


【解决方案1】:

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)nibBundleUIViewController 的指定初始化器。所以在你继承的类中,

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

每当 Apple 将一个初始化程序标记为指定初始化程序时,其他初始化程序将仅指向指定初始化程序。您不需要实现其他初始化程序。

NIB 加载使用 initWithCoder 这就是为什么您会在加载 nib 时看到它被调用的原因。

【讨论】:

    【解决方案2】:

    如果想要改变对象的初始化方式或进行额外的初始化,你只需要重写 init 方法。从 xib 加载 UIViewController(或任何东西)时,调用 init 方法时,您的插座将不会连接。

    一旦加载了 xib 中的所有对象并建立了连接,就会调用 awakeFromNib。实现它以查看是否所有内容都已正确加载(应该)。

    【讨论】:

      猜你喜欢
      • 2013-06-11
      • 2020-01-14
      • 2021-09-23
      • 1970-01-01
      • 2016-11-16
      • 2016-05-27
      • 2015-03-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多