2009-04-21 44 views
9

我對iPhone編程非常新穎,並且遇到了一些奇怪的問題。對於下面的類,init方法永遠不會被調用 - 我有一個NSLog函數,它應該告訴我什麼時候init被執行。這裏是相關的代碼:iPhone UIViewController初始化方法不被調用

@interface MyViewController : UIViewController { 
} 
@end 

@implementation MyViewController 
- (id) init 
{ 
    NSLog(@"init invoked"); 
    return self; 
} 
@end 

任何想法,我做錯了 - 如果有的話?希望我提供了足夠的信息。

謝謝。

回答

3

該視圖提出了嗎?使用這些方法進行額外的初始化:

- (void)viewWillAppear:(BOOL)animated { 
    [super viewWillAppear:animated]; 
    //... 
} 

// Implement viewDidLoad to do additional setup after loading the view. 
- (void)viewDidLoad { 
    [super viewDidLoad]; 
    //.. 
} 
+0

謝謝!這工作。雖然它在我的嘴裏留下一點酸味,看到iPhone上Obj-C的一些不一致。好吧。 – farhany 2009-04-21 11:53:43

22

您可能是從NIB文件創建視圖控制器。所以,與其叫「初始化」的消息,這是被稱爲一個創造者的消息:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { 
    if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { 
     // Custom initialization 
    } 
    return self; 
} 

嘗試,如果是被調用的一個。肖恩說的是真的。你可以使用這些消息來完成類似的事情。

祝你好運。

+1

你絕對正確。感謝您的輸入! – farhany 2009-04-21 11:56:12

+0

在我發表上面的評論之後,我意識到爲什麼init不會被稱爲...:P – farhany 2009-04-21 23:19:46

+0

指定的初始化程序。如果以編程方式創建控制器**,並且想要執行不適合viewDidLoad的自定義,則覆蓋。 – 2011-04-21 10:46:00

1

請參考參考文件中的'指定初始值設定項'。

2

但是,UI組件有時會有幾個init *方法,我們是否需要重寫所有這些方法才能執行一些init?東東?

22

如果您正在使用故事板,則會調用initWithCoder:。參考文件說:

如果應用程序使用一個故事板定義視圖控制器及其相關 意見,你的應用程序從未直接初始化該類 的對象。相反,視圖控制器可以通過 故事板實例化 - 當觸發Segue時由iOS自動執行,或者在應用程序調用故事板對象的 instantiateViewControllerWithIdentifier:方法時通過編程方式執行 。當從故事板實例化視圖控制器時,iOS通過調用其initWithCoder:方法來初始化新視圖 控制器。 iOS 自動將nibName屬性設置爲存儲在 故事板內的nib文件。

initWithCoder:方法不是.m文件的默認模板的一部分,所以你要自己添加在您的UIViewController子類:

- (id)initWithCoder:(NSCoder *)aDecoder { 

    self = [super initWithCoder:aDecoder]; 

    if (self) { 
     // Custom initialization 
     NSLog(@"Was called..."); 
    } 

    return self; 
} 

沒有必要從刪除initWithNibName:bundle:您代碼,但它不會被調用。

相關問題