指定的初始化器是所有其他初始化器必须调用的初始化器。 UIView 和子类有点不寻常,因为它们实际上有两个这样的初始化程序:-initWithFrame: 和 -initWithCoder:,这取决于视图的创建方式。如果你在代码中实例化视图,你应该覆盖-initWithFrame:,如果你从笔尖加载它,你应该覆盖-initWithCoder:。或者,您可以将代码放在第三种方法中并覆盖这两个初始化程序,以便它们调用您的第三种方法。事实上,这通常是推荐的策略。
因此,例如,您可以创建一个 UIView 子类 ClueCharacter,它有自己的初始化方法:-initWithPerson:place:thing:。然后,您可以像这样创建视图:
对象-C:
ClueCharacter *mustard = [[ClueCharacter alloc] initWithPerson:@"Col. Mustard"
place:kInTheStudy
thing:kTheRope];
斯威夫特:
var mustard = ClueCharacter("Col. Mustard", place: kInTheStudy, thing: kTheRope)
这很好,但是为了初始化对象的 UIView 部分,你的方法必须调用指定的初始化器:
对象-C:
-(id)initWithPerson:(NSString*)name place:(CluePlace)place thing:(ClueWeapon)thing
{
if ((self = [super initWithFrame:CGRectMake(0, 0, 150, 200)])) {
// your init stuff here
}
}
斯威夫特:
func init(name: String, place : CluePlace, thing : ClueWeapon)
{
if (self = super.init(CGRectMake(0, 0, 150, 200))) {
// your init stuff here
}
}
如果你想调用你的子类的初始化器-init,只要你在实现中调用-initWithFrame:就可以了。