如何在 UIView 的子类中同时覆盖 initWithFrame: 和 initWithCoder:?

Posted

技术标签:

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

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

【问题讨论】:

请看这里并查看代码示例***.com/a/17798646/381807 【参考方案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 中实现的共同行为。

【讨论】:

以上是关于如何在 UIView 的子类中同时覆盖 initWithFrame: 和 initWithCoder:?的主要内容,如果未能解决你的问题,请参考以下文章

如何覆盖子类的 swift 协议函数(例如 UIView 中的 UILabel)

快速覆盖 UIView 中的默认图层类型

在 Swift 3.1 中为 UIView 子类设置默认外观而不覆盖 initialize()

子类化和覆盖使用 nib 文件创建的 UIView

如何提示编译器使用 UIView 子类

如果 drawRect: 被覆盖,子类化的 UIView 显示黑色背景