2011-09-29 142 views
0

我問這個問題,因爲它看起來viewDidLoad在初始化器的主塊之前被調用並且我在初始化器中初始化的類變量在viewDidLoad中變爲零。爲了供您參考,我以編程方式執行了整個viewcontroller,並且創建了一個自定義初始化程序,以便我可以接受要在我的viewcontroller中使用的各種參數。當然,我的自定義初始化程序調用UIViewControllers指定的初始化程序。將參數發送到UIViewController的最佳方式是什麼?

基本上,我很好奇什麼是正確的設計模式發送參數到UIViewController?我已閱讀關於此的其他線程,並沒有真正得到明確的答案。我應該跳過初始化程序並手動設置屬性(從課外)嗎?這似乎有點不爽,我真的想發送一些參數,並且很好奇別人怎麼去做這件事?

回答

7

原因初始化完成之前viewDidLoad中被調用時,可能是因爲你調用視圖方法在初始化器中。例如:

- (id)init 
{ 
    if ((self = [super init])) { 
     _thing = 123; 
     _other = self.view.frame.size.width/2; 
    } 

    return self; 
} 

viewDidLoad被稱爲當視圖負載。您調用view方法後立即載入視圖(如果您願意,還可以訪問視圖屬性)。所以你應該避免在init中引用視圖。

要回答你的問題,我更喜歡爲我的視圖控制器創建一個init方法。

- (id)initWithThing:(MyThing *)thing thang:(MyThang *)thang 
{ 
    if ((self = [super init])) { 
     _thing = [thing retain]; 
     _thang = [thang retain]; 
     // ... 
    } 

    return self; 
} 

您也可以在啓動後使用屬性來設置額外的變量。就個人而言,我更喜歡只使用可選屬性來完成此操作,並將所需的屬性放在init方法中。這樣我就無法啓動無效狀態的視圖控制器。

1

基本上你應該爲你的輸入數據定義屬性,但添加一個自定義的init函數。
如果你創建一個自定義的初始化方法,你應該沒問題 - 記住initWithNibName:bundle:UIViewController的主要初始化程序,所以這是你想從你的自定義init-Method中調用的。 viewDidLoad總會後的customVC.view(無論是從您的代碼或通過框架)第一次使用的初始化方法被稱爲:

- (id)initWithDataObject:(MyDataObject*)obj 
{ 
    self = [super initWithNibName:nil bundle:nil]; 
    if (self) { 
     self.dataObj = obj; 
    } 
    return self; 
} 
1

我將我的控制器的狀態封裝在一個附加的狀態對象中。所以控制器通常擁有GUI元素的ivars和對這個狀態對象的引用。

狀態對象由我的委託上的StateManager對象處理。因此,如果讓控制器引用另一個控制器並直接設置變量,則所有更改都將通過此管理器。多一點工作,但不太雜亂。

任何類都可以檢索任何其他控制器的狀態並進行更改。這是一些控制器的目的(例如:從專用控制器上選擇YouTube上的視頻)。但通常只有一個類獲取狀態以使用initWithState:來推送下一個控制器。推送的控制器然後將狀態應用於其在viewDidLoad中的GUI或改變從前一類傳遞的狀態對象。

StateManager保存所有狀態對象的字典。我保持狀態對象圖亮,例如:我存儲對圖像的引用,但不存儲圖像本身。應用程序的真正優勢在於Core Data,我只用這些來處理GUI狀態。 StateManager偵聽應用程序的退出事件並使用NSCoding將狀態字典保存到磁盤。狀態對象ivars總是零或一些有意義的值,沒有懸掛指針。

我正在研究我的第二個iPhone應用程序,這似乎在工作,但我也很想知道其他人是如何做到的。任何輸入是受歡迎的。

相關問題