5

進入一些有趣的事情,想知道我是否做錯了什麼或者這是否是正確的行爲。自動加載XIT for UITableViewController

我有一個自定義的UITableViewController。我以爲(第一個錯誤),如果初始化爲這樣:

[[CustomTableController alloc] init]; 

它會自動從同名的廈門國際銀行加載,CustomTableController.xib,如果是在相同的目錄和等。

但是

這是行不通的;不加載XIB。但是,如果我將我的控制器的父類從'UITableViewController'更改爲'UIViewController',那麼EVERYHTING WORKS FINE!

呼喚:

[[CustomTableController alloc] init]; 

負載從我的廈門國際銀行的控制器和視圖。

我做錯了什麼?這是一個錯誤?預期的行爲?

回答

26

Cocoa Touch中的大多數類都列出了一個「指定初始值設定項」,當你將它們繼承時,你應該從你的init方法中調用它。當您創建自己的自定義類時,最好檢查文檔以找到超類的指定初始化程序。當你使用更普通的超類(在這種情況下調用 - [NSObject init])中的其他初始化方法初始化類時,會搶奪你的直接超類有機會正確初始化其狀態。有時你可以逃避這一點。通常你不能。

UIViewController的文檔聲明其指定的初始化程序是 - initWithNibName:bundle:。如果你用nil nibName調用這個方法,它會查找一個與你的類名匹配的nib。 -init的行爲未被記錄在UIViewController中。根據您所看到的行爲,似乎可能會調用[self initWithNibName:nil bundle:nil],但直接致電initWithNibName:bundle:而不是依賴此無證行爲會更安全。

UITableViewController只定義了一個初始化程序-initWithStyle:(儘管它沒有指定此方法爲指定的初始化程序)。此方法在不使用nib的情況下初始化您的UITableViewController,通常很好。由於您不需要將子視圖添加到UITableView,因此通過使用筆尖配置UITableViewController通常沒有多少好處。

如果決定要通過筆尖配置UITableViewController,文檔告訴我們我們可以安全地繞過-initWithStyle:並調用UIViewController的initWithNibName:bundle:方法。以下是文檔告訴我們如何我們的UITableView及其控制器將在每種情況下被初始化:

  • 如果通過initWithNibName:bundle:方法指定的筆尖文件(這是由超UIViewController的聲明), UITableViewController加載存檔在nib文件中的表視圖。否則,它將創建一個具有正確尺寸和自動調整大小掩碼的未配置的UITableView對象。你可以通過tableView屬性訪問這個視圖。

  • 如果加載了包含表視圖的nib文件,則數據源和委託將成爲在nib文件(如果有)中定義的那些對象。如果未指定nib文件或者nib文件未定義數據源或委託,則UITableViewController將數據源和表視圖的委託設置爲self。

總之,對於大多數可可觸摸類的文檔或者指定一個指定初始化或者,你可以從你的子類安全地調用初始化了一把。總是參考你的超類的文檔來找出你的子類應該調用哪個初始化器。

+0

優秀的答案,謝謝!希望我能給你更多的觀點。 – ACBurk 2010-04-10 18:00:17

+0

當我創建一個帶有UIView的xib和一個UITableView時,我的應用崩潰,並嘗試用initWithNibName加載該xib,如您所描述的。它抱怨「 - [UITableViewController loadView]加載了」XXXXXXTableViewController「的筆尖,但沒有得到一個UITableView。我也試着讓xib的根視圖只是一個UITableView,但是當我這樣做時,應用程序會加載,但是我沒有對該表進行的自定義顯示在應用程序中顯示:/ – 2011-02-09 05:08:34

+0

我以爲我會瘋狂它似乎是加載與班級相同名稱的筆尖。非常好的解釋。 – zekel 2011-12-27 01:14:10