两个控制器之间使用故事板传递数据
我想从一个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在ListsViewController
的subject
显示为空。
有任何想法吗?
您需要覆盖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; }