如何在 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)