UIView中的initWithFrame

时间:2017-05-24 05:29:09

标签: ios objective-c xcode uiview

在早期版本的Xcode中,当我创建UIView的新子类时,下面的代码会自动生成在实现文件中:

- (id)initWithFrame:(CGRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        // Initialization code...
    }
    return self;
}

我试图再次重新认识它,现在它似乎不再自动生成了。这有什么理由吗?这不是正确的做法吗?

谢谢!

2 个答案:

答案 0 :(得分:0)

我不认为有一个"硬"原因。请记住,这样的自动生成代码是为了方便起见。

但是,可能有两个原因:

一个。您无法确定这是否是视图子类的有用初始值设定项。这就是猜测。通常,为初始化程序提供尽可能多的属性是个好主意。

B中。如果你有一个具有更多args的初始化程序,这通常是指定的初始化程序。在这种情况下,生成的代码完全错误,因为-initWithFrame:成为辅助初始化程序并且必须执行指定的初始化程序。生成错误代码不是一个好主意。

但这也是猜测。

答案 1 :(得分:0)

  

...现在它似乎不再自动生成了。这有什么理由吗?这不是正确的做法吗?

“生成”代码实际上只来自模板文件,所有发生的事情都是模板文件在某些​​时候发生了变化。 const arr1=[{id:1,name:"apple"},{id:2,name:"mango"}],arr2=[{parentId:1,time:[1,2,3]},{parentId:1,time:[4,5,6]},{parentId:1,time:[7,8,9]},{parentId:2,time:[11,12]}]; let result = arr1.map(a1=>{ let times = arr2.filter(a2=>a2.parentId===a1.id).map(a2=>a2.time); a1.time = [].concat.apply([], times); return a1; }); console.log(result);-initWithFrame:仍然是-iniWithCoder:的有效默认初始值设定项,如果需要,您应该覆盖其中的一个或两个。

我不知道更改模板背后的实际原因,但也许是因为与UIView中可以覆盖的各种其他方法相比,初始化方法没有什么特别之处。几乎每个UIView子类都需要覆盖UIView,因此将它包含在模板中是有意义的,但对于-drawRect:-initWithFrame:则不然。