objective-c - Objective-C - 自定义 View 和实现 init 方法?

标签 objective-c initwithframe initwithcoder

我有一个自定义 View ,我希望能够在 in-codenib 中初始化。

编写 initWithFrameinitWithCoder 方法的正确方法是什么? 它们都共享一个用于某些初始化的代码块。

最佳答案

在这种情况下,正确的做法是创建另一个包含 -initWithFrame:-initWithCoder: 通用代码的方法,然后调用该方法来自 -initWithFrame:-initWithCoder::

- (void)commonInit
{
    // do any initialization that's common to both -initWithFrame:
    // and -initWithCoder: in this method
}

- (id)initWithFrame:(CGRect)aRect
{
    if ((self = [super initWithFrame:aRect])) {
        [self commonInit];
    }
    return self;
}

- (id)initWithCoder:(NSCoder*)coder
{
    if ((self = [super initWithCoder:coder])) {
        [self commonInit];
    }
    return self;
}

请注意 Justin 的回答中概述的问题,特别是任何子类不得覆盖 -commonInit。我在这里使用该名称是为了说明它的值(value),但您可能想要一个与您的类更紧密相关并且不太可能被意外覆盖的名称。如果您正在创建一个不太可能自己被子类化的专用 UI​​View 子类,那么使用上面的通用初始化方法就完全没问题了。如果您正在编写供其他人使用的框架,或者如果您不了解该问题但想做最安全的事情,请改用静态函数。

关于objective-c - Objective-C - 自定义 View 和实现 init 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7226239/

相关文章:

objective-c - 获取 Mavericks 中 "Displays have separate spaces"选项的值

objective-c - Objective-C 是否编译为 native 代码或字节码?

ios - Sublayer 只在 initWithFrame 中创建时绘制,不在 initWithCoder 中绘制

macos - InitWithCoder 从未调用过基于 Cocoa NSView 的类

ios - 尝试从界面生成器加载 Nib

ios - 为什么 GCDAsyncUdpSocket 在广播模式下一段时间后无法发送/接收数据包?

iphone - 在 hittest 中的点上应用 CGAffineTransformRotate

ios:关于 init(frame:) 和 init?(coder:) 的问题

iphone - 使用 Storyboard时设置完成的 TabBar 图像?