2015-06-23 77 views
0

我發現的涉及實施協議和代表的大多數信息都涉及到您執行此操作的步驟;設置代表(僅適用於協議)僅適用於prepareForSegue?

DestinationViewController *destinationVC = [[destinationViewController alloc] init]; 
    destinationVC.delegate = self; 

但數小時後無奈的,因爲我無法得到它的工作,我終於跨越另一種方式來分配destinationVC迷迷糊糊的prepareForSegue

DestinationViewController *destinationVC = segue.destinationViewController; 
    destinationVC.delegate = self; 

哪些實際工作。我做錯了什麼?它似乎使用我的委託從未設置爲自我的第一種方法。

+0

如果你正在使用視圖控制器故事板則始終使用segue來創建該類的對象。你的場景我認爲同樣的事情是因爲你使用記分板來創建類,而不是覆蓋DestinationViewController的init方法。 –

回答

1

當從故事板實例化,initWithCoder: methid被調用,而不是init方法。

DestinationViewController *destinationVC = [[destinationViewController alloc] init]; 
    destinationVC.delegate = self; 

是你如何處理你的控制器不是從故事板:你從代碼中初始化它。之後,您必須手動處理從源VC到目標VC的轉換。

DestinationViewController *destinationVC = segue.destinationViewController; 
destinationVC.delegate = self; 

是當你的控制器在故事板中定義並且是segue的目的地時的方式。 當你執行一個segue時,調用源視圖控制器的prepareForSegue:方法,你應該在其中配置你想要的目的地:設置屬性,代理,傳遞數據......

1

有兩種方法可以pushController,同時使用UIStoryboard

選項1:實際參考UIViewControllerstoryboard

UIViewController *displayTable = [self.storyboard instantiateViewControllerWithIdentifier:@"nextViewcontroller"]; 
[self.navigationController pushViewController:displayTable animated:YES]; 

選項2:使用Segue

[self performSegueWithIdentifier:@"MySegue" sender:sender]; 

在你第一種情況下你分配對象和分配委託。這並不意味着在執行pushViewController操作時相同的參考文件已通過。所以在這種情況下會創建兩個不同的參考。所以你委託指出了一些不存在的其他參考。

這可以幫助你。

1

這是關於segues的基本教程,已針對Xcode 6及更高版本進行了更新。

https://developer.apple.com/library/ios/recipes/xcode_help-IB_storyboard/chapters/StoryboardSegue.html

當你使用故事板,通過UIStoryboardSegue類提供所有必要的內容。它爲您保存目標視圖控制器。所以,你必須訪問目標控制器拋出destinationViewController屬性。

,如果你想手動添加控制器到您的導航堆棧:

{ 
    // binds your viewController from storyboard with local instance 
    UIViewController *vc = [self.storyboard instantiateViewControllerWithIdentifier:@"YOUR_STORYBOARD_IDENTIFIER"]; 
    // set your delegate 
    vc.delegate = self; 
    // push controller into navigation stack 
    [self.navigationController pushViewController:vc animated:YES]; 

}