2015-04-12 40 views
-2

爲什麼Passing Data between View Controllers的以下代碼有效? :爲什麼在視圖控制器之間傳遞數據與segue工作

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{ 

    if([segue.identifier isEqualToString:@"showDetailSegue"]) 
    { 
     ViewControllerB *controller = (ViewControllerB *)segue.destinationViewController; 
     controller.isSomethingEnabled = YES; 
    } 

} 

我看到的一切都是他創建了ViewControllerB類的一個實例。我不明白該實例(控制器)如何成爲它傳遞該數據的實際ViewController?我錯過了什麼概念?

回答

2

您發佈的代碼是而不是實例化新的ViewControllerB實例。在調用prepareForSegue:sender:時,視圖控制器已經由故事板實例化並分配給傳入的segue的destinationViewController屬性。因此,代碼實際上只是獲得了已經創建並將在segue中使用的視圖控制器的引用。

視圖控制器編程指南適用於iOS在部分Segues Automatically Instantiate the Destination View Controller

一個賽格瑞代表帶來了一個新的觀點 控制器到您的應用程序的用戶界面觸發過渡。

塞格斯含有大量的信息有關的過渡,包括 以下:

  • 稱爲發件人
  • 啓動該SEGUE源視圖控制器導致被觸發SEGUE的物體,
  • 目的地視圖控制器被實例化
  • 那種過渡的應用來使目的地視圖控制器屏幕上
  • 標識,在故事板

當賽格瑞被觸發特定SEGUE,iOS設備執行以下操作的可選標識符串:

  1. 它實例化使用該屬性的目的地視圖控制器的值,在所提供故事板。
  2. 它給源視圖控制器配置新控制器的機會。
  3. 它執行在segue中配置的轉換。
+0

哦,我想我明白了。創建該控制器時,我將爲其分配segue.destinationViewController的內存地址,該地址是對傳遞數據的實際ViewController的引用,因此控制器實際上就是該ViewController(因爲它指向的地址與segue相同。 destinationViewController),對嗎? –

+0

執行在故事板中創建的細分時(大概是99%的時間),您根本不會創建_or_分配視圖控制器 - 這是爲您完成的。您只需使用'prepareForSegue:sender:'來配置(「準備」)該視圖控制器。爲了方便起見,可以通過傳入的'segue'(它的'destinationViewController'屬性)來訪問視圖控制器的引用。所以在這個意義上你是對的 - 'segue.destinationViewController'指向與被轉換到的實際視圖控制器相同的內存地址。 – Stuart

+0

ViewControllerB * controller =(ViewControllerB *)segue。destinationViewController;控制器會指向segue.destinationViewController的地址嗎?我問這是因爲我只修改controller.isSomethingEnabled,而不是segue.destinationViewController.isSomethingEnabled –

相關問題