我希望我没有问一些已经回答过的问题(但是我没有找到这个问题的答案,所以希望我不是)。
我有一个应用程序在当前的xcode版本,使用segue和navigationController。我需要将数据从一个视图传递到另一个视图,最简单的方法是什么?我跑到一些sharedData的东西,可能是钩到performSegueWithIdentifier方法,但不知道如何使用它(或者它是否是正确的选择这样做)。
谢谢
segue有两个视图控制器:sourceViewController
和destinationViewController
。当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