有几个解决方案,第一个是使用
prepareForSegue(_:sender:) 方法:
讨论
这个方法的默认实现什么都不做;你
可以覆盖它以将相关数据传递给新的视图控制器或
窗口控制器,基于 segue 的上下文。转场对象
描述转换并包括对两个控制器的引用
参与了segue。
可以从多个来源触发 Segue,因此请使用以下信息
在 segue 和 sender 参数中区分不同的
应用程序中的逻辑路径。例如,如果 segue 源自
表格视图,发送者参数将标识用户的单元格
点击。您可以使用该信息在
目标视图控制器。
在这种情况下,您需要“保存”一个您想在 didSelectRow 中传递的对象:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
self.currentObjectToPass = .. some object from array or somewhere else..
}
然后设置为下一个vc:
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(UIButton*)sender {
if ([segue.identifier isEqualToString:@"bookingDetailsSegue"]) {
self.nextVC = segue.destinationViewController;
self.nextVC.objectToPass = self.currentObjectToPass;
}
}
另一种方式是拒绝使用segue,通过storyboardID获取vc。
这种方式你需要
instanceViewController(withIdentifier:) 方法:
返回值 指定对应的视图控制器
标识符字符串。如果没有视图控制器与
字符串,这个方法会抛出异常。
讨论你使用这个方法来创建视图控制器对象
你想在你的
应用。在您可以使用此方法检索视图之前
控制器,您必须使用适当的标识符显式标记它
Interface Builder 中的字符串。
此方法创建指定视图控制器的新实例
每次调用它。
那么您的代码将如下所示:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
self.nextVC = [self.storyboard instantiateViewControllerWithIdentifier:@"nextVCID"];
self.nextVC.objectToPass = = .. some object from array or somewhere else..
[self.navigationController pushViewController:self.nextVC animated:YES];
}
别忘了在 IB 中设置 vc 标识符(Storyboard ID):