2011-12-10 26 views
16

我希望我沒有問過已經回答的問題(但我沒有找到答案,所以希望我不會)。performSegueWithIdentifier and sharedData

我在當前的xcode版本中使用了segues和navigationController。我需要將數據從一個視圖傳遞到另一個視圖 - 最簡單的方法是什麼?我遇到了一些sharedData的東西,可能會掛在performSegueWithIdentifier方法上,但不知道如何使用它(或者它是否是這樣做的正確選擇)。

由於

+1

如果您想使用真實姓名,請修改您的用戶名,不要在帖子中多加一行。 :) – mac

回答

35

甲賽格瑞具有兩個視圖控制器:sourceViewControllerdestinationViewController。當UIKit執行一個segue時,它發送一個prepareForSegue:sender:消息給源VC。您可以在視圖控制器子類中重寫該方法以將數據傳遞到目標VC。

例如,假設您有一個帶有電影表格視圖的主視圖控制器,並且當用戶在表格視圖中單擊一行時,您想要繼續播放電影的詳細視圖控制器。

@implementation MasterViewController 

... 

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    DetailViewController *detailVC = segue.destinationViewController; 
    NSIndexPath *selectedPath = [self.tableView indexPathForSelectedRow]; 
    detailVC.movie = [self movieForIndexPath:selectedPath]; 
} 

這在Introducing Interface Builder Storyboarding視頻從WWDC 2011

另外值得一提的解釋說,當SEGUE的起源是一個表格視圖單元格或表視圖單元格的附件按鈕時,sender說法prepareForSegue:sender:是表格視圖單元格。

10

我認爲最好的辦法是導入視圖控制器的頭部,該視圖控制器將顯示在執行segue的控制器中。然後用它的存取或其他方法來傳遞內部prepareForSegue所需的數據:

// In FirstViewController.h 

#import "SecondViewController.h" 

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

    if ([[segue identifier] isEqualToString:@"SegueToSecondViewController"]) { 
     // Get destination view controller and don't forget 
     // to cast it to the right class 
     SecondViewController *secondController = [segue destinationViewController]; 
     // Pass data 
     secondController.dataArray = self.someDataArray; 
     secondController.name = @"Fancy name"; 
    } 
} 

當你想要的數據從第二到第一回,我建議使用委託:

// In FirstViewController.h 

#import "SecondViewController.h" 
#import "SecondViewControllerDelegate.h" 

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

    if ([[segue identifier] isEqualToString:@"SegueToSecondViewController"]) { 

     SecondViewController *secondController = [segue destinationViewController]; 

     // Declare first view controller as a delegate 
     secondController.delegate = self; 

     // Pass data 
     secondController.dataArray = self.someDataArray; 
     secondController.name = @"Fancy name"; 
    } 
} 

// Second controller's delegate method,controller 
// ie. used to return data after second view is dismissed 
- (void)secondControllerFinishedSomeTask:(NSArray *)someReturnedData { 
    // Do something with returned data 
} 
+0

方式很酷,謝謝你們! – Ondrej

2

當你想回數據從第二個到第一個,更好的方法是到use Unwind Segues

相關問題