2011-09-08 48 views
0

編輯:好吧,我學到的是你可以選擇initWithNibName或initWithCoder,這取決於你是否使用.xib。而「init」不是UIVIewController的構造函數方法。initWithNibName:什麼樣的自定義初始化?

這似乎是一個相當簡單的問題,但我不確定答案:我讀過這種方法「僅用於以編程方式創建視圖控制器」,並且在文檔中:「它是第一次加載視圖控制器的視圖訪問」

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

確定,所以要了解多一點:

你會寫什麼是‘定製的初始化’這個方法?
你什麼時候應該實現此方法,這樣的代碼,如果你正好可以分配好自己的viewController(例如:MyVC *myvc = [[MyVC alloc] initWithNibName:...bundle...];)後寫

謝謝您的回答

回答

2

通常我這樣做:

// Initialize controller in the code with simple init 
MyVC *myVC = [[MyVC alloc] init]; 

然後做這在我的init方法:

- (id)init { 
    self = [super initWithNibName:@"MyVC" bundle:nil]; 

    if (!self) return nil; 

    // here I initialize instance variables like strings, arrays or dictionaries. 

    return self; 
} 

如果CON troller需要從initializee一些參數,然後我編寫自定義initWithFoo:(Foo *)foo方法:

- (id)initWithFoo:(Foo *)foo { 
    self = [super initWithNibName:@"MyVC" bundle:nil]; 

    if (!self) return nil; 

    _foo = [foo retain]; 

    return self; 
} 

這使得初始化的簡化,以及額外的初始化爲您的視圖控制器如果它可以用不同的參數不同的位置進行初始化。然後在initWithFoo:initWithBar中,您只需調用init即可調用super並使用默認值初始化實例變量。

+0

謝謝你,很好的回答 – Paul

1

這是一個初始化方法,因此您在視圖控制器中開始工作時初始化需要初始化的所有內容。每個對象伊娃都會自動初始化爲nil,但您可以初始化要使用的NSMutableArray或想要成爲特定值的BOOL

如前所述,您每次有東西需要初始化時都執行此方法。在分配視圖控制器後,通常不會初始化事物,這樣,每次使用視圖控制器時都不需要它執行它(因爲您可能會在應用程序的不同位置使用它)。這也是最好的做法。

1

我通常在那裏配置的東西,我知道它不會改變。

例如,ViewController的標題:

self.title = @"MyTitle";

或者如果這是TabBar應用程序中主要的ViewController之一。也就是說,它擁有一個選項卡,然後我配置了TabBarItem這樣的:

UITabBarItem *item = [[UITabBarItem alloc] initWithTitle:@"something" 
        image:[UIImage imageNamed:@"something.png"] 
         tag:0]; 

self.tabBarItem = item; 

沒有的東西,你可以在那裏做各種各樣。

相關問題