performSegueWithIdentifier and sharedData



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

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

谢谢

segue有两个视图控制器:sourceViewControllerdestinationViewController。当UIKit执行一个segue时,它发送一个prepareForSegue:sender:消息到源VC。你可以在你的视图控制器子类中重写这个方法来传递数据到目标VC。

例如,假设你有一个带有影片表视图的主视图控制器,当用户单击表视图中的一行时,你想segue到影片的细节视图控制器。

@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的介绍Interface Builder storyboard 视频中有解释。

同样值得注意的是,当segue的原点是表视图单元格,或者是表视图单元格的附属按钮时,prepareForSegue:sender:sender参数是表视图单元格

我认为最好的方法是导入视图控制器的header它将在执行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";
    }
}

当你想从second到first返回数据时,我建议使用delegate:

// 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
}

当你想要从second到first返回数据时,更好的方法是使用Unwind segue

最新更新