两个控制器之间使用故事板传递数据

我想从一个UITableViewController传递数据到另一个。 这是我在初始视图控制器中的代码:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { Subject *subject = (Subject *)[self.fetchedResultsController objectAtIndexPath:indexPath]; [self showList:subject animated:YES]; [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; } - (void)showList:(Subject *)subject animated:(BOOL)animated { ListsViewController *lists = [[ListsViewController alloc] initWithStyle:UITableViewStyleGrouped]; lists.subject = subject; NSLog(@"%@", lists.subject); [self performSegueWithIdentifier:@"showDetail" sender:self]; } 

日志输出显示它已经传递了我想要的数据。 但是,当我执行segue并logging在ListsViewControllersubject显示为空。

有任何想法吗?

您需要覆盖prepareForSegue:sender:方法。 快速解决将是

 - (void)showList:(Subject *)subject animated:(BOOL)animated { [self performSegueWithIdentifier:@"showDetail" sender:subject]; } 

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"showDetail"]) { ListsViewController *controller = ([segue.destinationViewController isKindOfClass:[ListsViewController class]]) ? segue.destinationViewController : nil; controller.subject = ([sender isKindOfClass:[Subject class]]) ? subject : nil; } } 

你的代码不工作的原因是在你的showList:animated:方法中,你创build了一个ListsViewController实例并为它分配了一个subject ,但是这个视图控制器从来没有出现过。 相反, performSegueWithIdentifier:sender创build您的ListsViewController类的另一个实例, ListsViewController您的subject一无所知。 这就是为什么你需要等待UIStoryboardSegue从故事板实例化一个目标视图控制器,然后按照你想要的方式进行configuration,你可以在prepareForSegue:sender:方法中进行configuration。

另外,在performSegueWithIdentifier:sender方法中使用subject作为发送者可能不是最好的主意,因为它只是不是发送者:)。 我会做的是在你的视图控制器类中创build一个属性主题,并使用它prepareForSegue:sender:

 @interface MyViewController () @property (strong, nonatomic) Subject *subject; @end @implementation MyViewController - (void)showList:(Subject *)subject animated:(BOOL)animated { self.subject = subject; [self performSegueWithIdentifier:@"showDetail" sender:self]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"showDetail"]) { ListsViewController *controller = ([segue.destinationViewController isKindOfClass:[ListsViewController class]]) ? segue.destinationViewController : nil; controller.subject = self.subject; } } ... @end 

执行prepareForSegue并在这个方法中通过date

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if([seque.identifier isEqualToString:@"showDetail"]) { ListsViewController *lists = seque.destinationViewController; lists.subject = subject; } } 

这很好,但现在你需要添加这个:

首先而不是:

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

您需要发送对象:

 [self performSegueWithIdentifier:@"showDetail" sender:subject]; 

在你的ListsViewController.h中添加一个属性:

 @property (nonatomic, strong) Subject * subjectSegue; 

现在在你的第一个视图控制器中:

 - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"showDetail"]) { ListsViewController * lists = (ListsViewController *)[segue destinationViewController]; lists.subjectSegue = sender; } 

你需要明白performSegueWithIdentifier:sender:创build一个新的视图控制器实例。 所以你创build的ListsViewController不是正在屏幕上显示的。

你需要重写`prepareForSegue:sender:

 - (void)showList:(Subject *)subject animated:(BOOL)animated { [self performSegueWithIdentifier:@"showDetail" sender:self]; } - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { if ([segue.identifier isEqualToString:@"showDetail"]) { ListsViewController *controller = (ListsViewController *)segue.destinationViewController; controller.subject = self.subject; }