![](/img/trans.png)
[英]UIViewController init code: difference between initWithNibName and viewDidLoad
[英]UIViewController: [super init] calls [self initWithNibName bundle:]
我的UIViewController子類中有兩個初始化函數:
- (id)init
{
self = [super init];
if (self)
{
// Custom stuff
return self;
}
return nil;
}
和
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName: nibNameOrNil
bundle: nibBundleOrNil];
if (self)
{
// Custom stuff
}
return self;
}
我放置了init函數,以避免調用initWithNibName:bundle:方法。 我正在嘗試將xib文件取出。 不幸的是,通過調用[super init]來調用此init [[Myclass alloc] init]會調用initWithNibName:bundle:。
首先,我應該在文檔中的哪個位置閱讀,以便期望對父init方法的調用會調用我自己的initWithNibName:bundle:方法?
其次,這對蘋果來說是一個好的設計選擇。 我不明白為什么這是理想的行為? (可能是我沒有在這里看到大圖,所以請隨時向我提示。)
第三,如何最好地解決它。 我是否只將initWithNibName:bundle:從我的代碼中刪除? 在任何情況下,我都不希望選擇使用xib或手動實例化該類。
通常,我必須使用托管對象上下文來初始化我的視圖控制器。 我實現了簡單的-(id)initWithContext:
方法,在此方法中,我稱為super的initWithNibName:bundle:
方法。 這樣,我可以定義自己的xib名稱。
不確定問題的第一部分(即閱讀的東西),但是Apple的VC類模板顯示它們具有自己的initWithNibName:bundle
方法,該方法以與給定的相同參數調用super。 因此,從您的情況來看,我想確切地說這是指定的初始化程序,在super上調用簡單的init
方法並不安全,因為它將調用initWithNibName:bundle
。 我相信UIViewController的初始化看起來像這樣:
- (id)init
{
self = [self initWithNibName:nibNameDerivedFromClass bundle:probablyNilOrMainBundle];
if (!self) return nil;
// some extra initialization
return self;
}
由於超類沒有initWithNibName:bundle
因此它必須自己調用方法,使其成為指定的初始化程序。 由於您已重寫它,因此ObjC的運行時將您的類中的self
替換為該方法。
如果要從UIViewController的GUI的創建中排除Interface Builder,則必須重寫loadView
並自己創建視圖。 不要實現initWithNibName:bundle:
- (void)loadView {
// Init a view. The frame will be automatically set by the view controller.
UIView *view = [[UIView alloc] initWithFrame:CGRectZero];
// Add additional views (buttons, sliders etc.) to your view here.
// Set the view controller's view to the new view.
self.view = view.
}
首先,我應該在文檔中的哪個位置閱讀,以便期望對父init類的調用會調用我自己的initWithNibName:bundle:方法?
您不知道,這是設計的事情。 init
不是所有類的基本初始化方法
其次,這對蘋果來說是一個好的設計選擇。 我不明白為什么這是理想的行為? (可能是我沒有在這里看到大圖,所以請隨時向我提示。)
當init
調用它時,它將發送nil名稱和bundle,並且默認為空的xib文件。 總有一個xib文件,無論您是不是。
第三,如何最好地解決它。 我是否只將initWithNibName:bundle:從我的代碼中刪除? 在任何情況下,我都不希望選擇使用xib或手動實例化該類。
你不知道 如果您只是調用super,而只是轉發方法,則實際上並不需要那里的代碼。
您可以自定義視圖並在viewDidLoad方法中添加子視圖。 在此方法中,您可以通過檢查屬性nibName來檢查是否使用init或initWithNibName:bundle:創建了該類。 使用init時,nibName將為nil。
- (void)viewDidLoad
{
[super viewDidLoad];
if (!self.nibName) {
// View was not loaded from nib - setup view
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.