在早期版本的Xcode中,当我创建UIView的新子类时,下面的代码会自动生成在实现文件中:
- (id)initWithFrame:(CGRect)frame
{
self = [super initWithFrame:frame];
if (self) {
// Initialization code...
}
return self;
}
我试图再次重新认识它,现在它似乎不再自动生成了。这有什么理由吗?这不是正确的做法吗?
谢谢!
答案 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:
则不然。