performSegueWithIdentifier和sharedData

时间:2011-12-10 17:06:43

标签: iphone objective-c ios5

我希望我不会问一些已经回答的问题(但我没有找到答案,所以希望我不是。)

我在当前的xcode版本中有一个应用程序,使用segues和navigationController。我需要将数据从一个视图传递到另一个视图 - 最简单的方法是什么?我遇到了一些可能挂在performSegueWithIdentifier方法上的sharedData东西,但不知道如何使用它(或者是否正确选择这样做)。

由于

3 个答案:

答案 0 :(得分:34)

segue有两个视图控制器:sourceViewControllerdestinationViewController。当UIKit执行segue时,它会向源VC发送prepareForSegue:sender:消息。您可以在视图控制器子类中覆盖该方法,以将数据传递到目标VC。

例如,假设您有一个主视图控制器,其中包含电影的表视图,当用户单击表视图中的一行时,您希望转换为电影的详细视图控制器。

@implementation MasterViewController

...

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

在WWDC 2011的Introducing Interface Builder Storyboarding视频中对此进行了解释。

值得注意的是,当segue的原点是表格视图单元格或表格视图单元格的附件按钮时,sender的{​​{1}}参数是表格视图单元格。

答案 1 :(得分: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
}

答案 2 :(得分:2)

如果您希望数据从第二个回到第一个,更好的方法是use Unwind Segues