【问题标题】:Subclassing a UIView. init method is never called子类化 UIView。 init 方法永远不会被调用
【发布时间】:2013-02-14 22:43:14
【问题描述】:

我在界面生成器上有一个UIView。在我的视图控制器中,我有一个IBOutlet MyUIView,它指向界面生成器上的UIView

我将 UIView 的类更改为“MyUIView”(自定义 UIView 类),但似乎没有触发子类的 init 方法。

我做错了什么?

【问题讨论】:

  • 你能告诉你的代码你是怎么做的吗?
  • 代码中没有任何内容!在界面生成器中,我选择 UIView 并将类设置为“ShadowView”。我在 ShadowView 的 init 方法中放置了断点,但它从未进入这些方法。

标签: ios cocoa-touch uiview uiviewcontroller uikit


【解决方案1】:

简答:你需要使用initWithCoder:

来自initWithFrame: 文档:

如果您使用 Interface Builder 来设计您的界面,那么当您的视图对象随后从 nib 文件加载时,不会调用此方法。 nib 文件中的对象被重构,然后使用它们的 initWithCoder: 方法进行初始化,该方法修改视图的属性以匹配存储在 nib 文件中的属性。

如果您使用的是 nib / xib / Storyboard 文件,请使用initWithCoder:。如果您以编程方式创建视图,则可以使用initinitWithFrame:

【讨论】:

    【解决方案2】:

    您需要先调用initWithCoder,而不是init,然后调用init

    - (id)initWithCoder:(NSCoder *)aDecoder {
        if ((self = [super initWithCoder:aDecoder])) {
            [self baseClassInit];
        }
        return self;
    }
    
    - (void)baseClassInit {
    
        //initialize all ivars and properties    
    }
    

    【讨论】:

    • 谢谢,我去看看!
    • 您还需要实现 initWithCoder:,就像该代码一样。仅在覆盖 init 时从某个随机位置调用它是行不通的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多