2016-07-13 55 views
0

我試圖將一些數據傳遞給我的視圖控制器類這樣得到傳遞的數據:不能在viewDidLoad方法

MyViewController *vc = [[MyViewController alloc] init]; 
vc.myProperty = dataToBePassed; 
[self.navigationController pushViewController:vc animated:YES]; 

我需要做一些視圖配置在viewDidLoad中,但似乎viewDidLoad中早於財產分配。

然後在MyViewController實現:

- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSLog(@"%@", self.myProperty); // Here i get myProperty = nil 
} 

- (void)viewWillAppear 
{ 
    [super viewWillAppear]; 
    NSLog(@"%@", self.myProperty); // Here i get myProperty = dataToBePassed but it's to late 
} 

在viewDidLoad方法沒有實現單或委託模式怎樣才能得到傳遞的數據?

+1

你在'init'中做什麼導致視圖被加載?你可以在初始化程序中添加一個參數並傳入它。 – dan

+0

不,我不覆蓋MyViewController中的init方法。有沒有可能爲VC創建自定義初始化方法?我認爲所有VC初始化的東西都必須在'viewDidLoad'方法中。我錯了嗎? – rockhard

+1

如果你使用的是故事板,那麼你不能寫一個自定義的初始化器,但是如果你只是像手動調用初始化器那樣你可以使用自定義的初始化器。 – dan

回答

0

雖然您提供的代碼示例看起來技術上正確,但我使用@ john-elemans,因爲您需要顯示更多代碼。

有些東西是引用視圖導致它加載,因此導致viewDidLoad過早引發。

在任何情況下,如果有什麼(比如你的財產)是您的視圖結構的正確的建築物絕對必要的,我把它自己的指定初始化,例如,

- (id)initWithPhotoDiameter:(CGFloat)diameter 
{ 
    self = [super init...]; // some VC initializer that you should call 
    if (self) { 
     _photoDiameter = diameter; 
    } 

    return self; 
} 

通知使用支持實例變量_photoDiameter而不是self.photoDiameter。這是關於您應該使用後援伊娃的課程中唯一的地方,因爲self仍處於初始化過程中。

+0

我試過你的解決方案,它的工作原理與我預期的一樣!但是我仍然想知道爲什麼我的代碼沒有正常工作。如果我使用故事板,則在執行viewDidLoad之前總是執行'performSegueWithIdentifier'方法中的相同賦值。我想我會接受你的答案。感謝所有參與尋找解決方案的人。 – rockhard

1

嘗試這樣做

UIStoryboard *storyboard = [UIStoryboard storyboardWithName: 
          @"MainStoryboard" bundle:[NSBundle mainBundle]]; 

MyViewController *vc = [storyboard instantiateViewControllerWithIdentifier:@"storyboardIdentifier"]; 
vc.myProperty = dataToBePassed; 
[self.navigationController pushViewController:vc animated:YES]; 

你必須在故事板的視圖控制器先設定一個故事板標識符。

+0

我不使用故事板或筆尖。一切以編程方式完成,也許這會造成問題。但是,謝謝你的回覆。 – rockhard

+0

如何覆蓋init方法? –

0

從技術上講,有兩種方法對於與應用程序相關的視圖控制器的生命週期處理非常常見。

使用XIBs 當使用XIBs最常見的一個,如果不是最常見的流程來創建和設置您的視圖控制器通過編程來完成。在此過程之後,當初始化視圖控制器時,您可以選擇覆蓋init方法,以便視圖控制器在加載視圖之前獲得信息並緩解調整繪製內容的過程。您也可以在您的視圖控制器中創建一個方法,以調用視圖控制器使用的數據。

使用故事板 如果您正在使用故事板,我建議您相信通過它設置segges。我發現它們讓生活更輕鬆,它可以讓你使用某些方法來處理過渡。其中之一是prepareForSegue:sender:在該方法中,我發現在初始化訪問目標控制器後設置視圖控制器會更容易。您也可以考慮在viewDidLoad之前收集所有數據,因此遵循segue方法。

相關問題