【问题标题】:How to override both initWithFrame: and initWithCoder: in subclass of UIView?如何在 UIView 的子类中同时覆盖 initWithFrame: 和 initWithCoder:?
【发布时间】:2013-03-07 19:01:42
【问题描述】:

我正在尝试继承 UIView。我已经有一些指定的初始化程序,我希望有可能从代码或 Nib 文件初始化我的自定义视图。因此,Apple 告诉我们使用指定的初始化程序,但他们自己并没有这样做 - initWithCoder: 不会调用 initWithFrame:。我应该怎么做才能在这两种情况下调用我指定的初始化程序?没有办法吗?

【问题讨论】:

标签: ios objective-c uiview


【解决方案1】:

将您的特殊初始化打包在一种方法中。它可以是私有的(在 .m 中声明)。 然后覆盖这两个初始化器并从它们中调用您的 init 方法。

- (void)myInitialization
{
    //do your stuff
}

-  (id)initWithFrame:(CGRect)aRect
{
    self = [super initWithFrame:aRect];

    if (self)
    {
        [self myInitialization];
    }

    return self;
}

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

    return self;
}

【讨论】:

  • 我们不需要包含- (instancetype)init 初始化器吗?以防万一。我是目标 C 的新手。
  • 没有必要——UIView 的子类很少被 simple init 初始化。在同样的情况下,包含init 也可能有意义 - 即:如果某些类型的视图通常会使用固定框架或类似的东西进行初始化。
【解决方案2】:

如你所说:

initWithFrame: - 建议你实现这个方法。你 还可以实现自定义初始化方法,或者 而不是这种方法。

initWithCoder: - 如果你从一个 Interface Builder nib 文件和您的视图需要自定义 初始化。

我要做的只是一个双方都会调用的方法,这将具有您希望在 UIView 中实现的共同行为。

【讨论】:

    猜你喜欢
    • 2011-04-03
    • 2017-09-30
    • 1970-01-01
    • 2012-07-12
    • 2017-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-12
    相关资源
    最近更新 更多