2008-12-15 68 views
4

這應該是直截了當的上師。我沒有真正寫出任何代碼,只有幾個控制器和一個自定義的UIView。所有通過筆尖連接。該應用程序加載沒有崩潰,但我看不到我的自定義UIView我的NSLog()命中。UIViewController不加載我的自定義UIView

我的應用程序委託具有默認的模板代碼,它調用一個名爲TabAnimationController的類。 TabAnimationViewController將其視圖設置爲TabView。我確信在TabAnimationViewController的NIB中,File的所有者被設置爲TabAnimationViewController,並且我的UIView實例將其類設置爲TabView。

在TabView.m我想看看NSLog是如何打的,它根本沒有出現。

- (void)loadView { 
NSLog(@"calling loadView"); 
} 

- (id)initWithFrame:(CGRect)frame { 
NSLog(@"Calling initWithFrame:"); 
    return self; 
} 

奇怪。我不知道爲什麼即使經過適當的IB連接,我的NSLog不會顯示出來。只有放入drawRect的任何東西都會調用。爲什麼不是initWithFrame或loadView被擊中?如果我想以編程方式自定義此視圖,該怎麼辦?

回答

8

首先,當視圖從nib文件脫水時,而不是initWithFrameinitWithCoder被調用。所以你也需要在initWithCoder中實現你的初始化。 (如果你期望以編程方式創建你的TabView而不是在IB中掛鉤,那麼保持initWithFrame初始化可能是一個好主意,只需將你的初始化重構爲另一種方法,並從兩種實現中調用它即可。)

另外在上面的初始化代碼中,您必須始終調用超類的初始化。有一個鍋爐鋼板模式的所有自定義類在他們init實現使用的是:

if (self = [super initXXX]) { do your initialization } 
return self; 

其次,loadView這實際上是一個UIViewController方法,如果view出口控制的是無不是UIView方法只調用。

除非您使用控制器以編程方式自己編寫視圖,否則無需重寫loadView。相反,您應該覆蓋在視圖加載後調用的viewDidLoad以執行附加初始化。

+0

我會說你*必須*調用超級初始化,不應該。在上一次的WWDC上有這樣一首美妙的歌曲:http://www.youtube.com/watch?v=ajlESsRXqmM – 2008-12-15 12:55:45

0

最簡單的方法就是在創建新項目時使用「基於視圖的應用程序」模板。它建立了你需要開始的一切。

但是,總之,你正在尋找錯誤的方法。首先,除非您以編程方式創建視圖,否則不應該覆蓋loadView。如果是從XIB文件加載,請查看initWithNibName方法。

你也可能想看看viewDidLoad中viewWillAppear中和觸發viewDidAppear方法,嗯,這是當相當明顯!

相關問題