問題描述:
項目中創(chuàng)建了一個XBLoginViewController,并勾選了Also Create XIB file,于是項目中生成了XBLoginViewController.h,XBLoginViewController.m和XBLoginViewController.xib三個文件.
需要push或者modal這個xib時,使用[[XBLoginViewController alloc]init]創(chuàng)建,并且使用[[XBLoginViewController alloc] initWithNibName:nil bundle:nil]也是可行的.
但是!
但是!
但是!
當(dāng)根據(jù)需求再在項目中創(chuàng)建一個繼承UIView的XBLoginView時,使用上面的方法使用XBLoginViewController就會造成應(yīng)用崩潰:
reason: ‘-[UIViewController _loadViewFromNibNamed:bundle:] loaded the “XBLoginView” nib but the view outlet was not set.’
而且,模擬器運(yùn)行正常,只有真機(jī)報錯崩潰.
字面含義是UIViewController在加載xib的過程中沒有找到一個和XBLoginView連接的屬性,無論你在XBLoginViewController中有沒有使用到這個XBLoginView.
錯誤原因
創(chuàng)建UIViewController如果勾選了Also Create XIB file,再創(chuàng)建相應(yīng)的控制器時,系統(tǒng)會自動在mainBundle中尋找同名的xib文件,所以不指定xib文件名也是可行的.但是如果項目中同時存在一個同名的View,那么系統(tǒng)會優(yōu)先匹配這個View作為UIViewController的view,顯然,這會導(dǎo)致crash.
解決方案
創(chuàng)建時指定xib名:[[XBLoginViewController alloc]initWithNibName:@"XBLoginViewController" bundle:nil];