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

时间:2013-03-07 19:01:42

标签: ios objective-c uiview

我正在尝试将UIView子类化。我已经有一些指定的初始化程序,我希望有可能从代码或Nib文件初始化我的自定义视图。因此,Apple告诉我们使用指定的初始值设定项,但他们不是自己做的 - initWithCoder:不会调用initWithFrame:。在两种情况下,如何调用指定的初始化程序,我该怎么办?有没有办法做到这一点?

2 个答案:

答案 0 :(得分:42)

在一个方法中打包您的特殊初始化。它可以是私有的(在.m中声明)。 然后覆盖两个初始值设定项并从其中调用init-method。

- (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;
}

答案 1 :(得分:5)

正如你所说:

  

initWithFrame: - 建议您实现此方法。您   除了或之外,还可以实现自定义初始化方法   而不是这种方法。

     

initWithCoder: - 如果从中加载视图,请实现此方法   Interface Builder nib文件和您的视图需要自定义   初始化。

我要做的只是一种双方都会调用的方法,这种方法会在UIView中实现您想要实现的常见行为。