這幾天視覺稿還沒有出來挤巡,于是開始做一些通用的公共組件析藕。自定義了幾個控件類阿纤,發(fā)現(xiàn)出現(xiàn)自定義控件無法響應(yīng)事件,就在網(wǎng)上查了下資料揍堕,遂記下料身。
程序里創(chuàng)建了一個帶xib的MyViewController。然后在xib里拖進(jìn)去一個UIView進(jìn)去衩茸,然后把這個UIView的custom class 改寫成MyCustomControl(自定義的一個控件繼承自UIView芹血,可以響應(yīng)點(diǎn)擊事件)。然后運(yùn)行楞慈,發(fā)現(xiàn)點(diǎn)擊這個自定義控件時無法響應(yīng)點(diǎn)擊事件幔烛。。囊蓝。
MyViewController的實(shí)例是通過[ [MyViewController alloc] init] 方式創(chuàng)建和初始化的饿悬。打開MyViewController.m文件發(fā)現(xiàn)只有
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
初始化方法(創(chuàng)建MyViewController時Xcode自動創(chuàng)建的),但并沒有init方法聚霜,而且這個方法被調(diào)用了狡恬。當(dāng)然我們知道所有繼承自NSObject類的對象都會從父類繼承到init方法。而我的MyViewController實(shí)例通過[ [MyViewController alloc] init] 創(chuàng)建和初始化的俯萎。因此可以猜測下傲宜,對于帶xib的類通過init方法初始化的時候,雖然我們沒有重寫init方法夫啊,但是Xcode一定在某個地方為我們的MyCustomControl重寫了init方法函卒,并且改方法體里會主動調(diào)用initWithNibName:bundle:方法。問題就來了撇眯,如果我們通過initWithNibName:bundle:或者loadNibNamed等通過加載xib方式來初始化視圖的時候报嵌,是不會調(diào)用xib里各控件對象的- (id)initWithFrame:(CGRect)frame方法的(如果代碼生成的視圖則會調(diào)用來完成視圖的初始化)。而是通過給xib里的各個對象發(fā)送awakeFromNib消息熊榛,來完成各個控件對象的初始化(MyCustomControl里重寫init方法锚国,發(fā)現(xiàn)該方法也沒有被調(diào)用)。因此我之前在MyCustomControl寫的各個響應(yīng)事件的根本就沒有作用玄坦,因?yàn)楦揪蜎]有執(zhí)行過血筑,++绘沉。
只要在MyCustomControl里重寫awakeFromNib方法即可,done豺总。