How to override both initWithFrame: and initWithCo

2019-01-22 18:58发布

问题:

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.