I'm trying to subclass UIView. I already have some designated initializer and I want to have possibility for my custom view to be initialized either from code or from Nib file. So, Apple told us to use designated initializer, but they are not doing it themselves - initWithCoder:
doesn't call initWithFrame:
. What should I do to have my designated initializer be called in both situations? Is there no way to do that?
可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
回答1:
Pack your special initialization in one method. It can be private (declared in .m). Then override both initializers and call your init-method from within them.
- (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;
}
回答2:
As you said:
initWithFrame: - It is recommended that you implement this method. You can also implement custom initialization methods in addition to, or instead of, this method.
initWithCoder: - Implement this method if you load your view from an Interface Builder nib file and your view requires custom initialization.
What I would do is just a method that both would call, which would have common behavior you want to implement in your UIView
.