UITableView在嵌入式容器内部的控制器之间传递数据

我有一个简单的测试项目。 一个UITableViewController(MasterViewController)嵌入在故事板中的导航控制器中。 我不是在使用prepareForSegue将数据传递给另一个视图控制器(DetailViewController)。 相反,didSelectRowAtIndexPath用于更新detailviewcontroller中的标签,如下所示:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { DetailViewController *detailViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"DetailViewController"]; NSMutableString *object = thisArray[indexPath.row]; detailViewController.passedData = object; [self.navigationController pushViewController:detailViewController animated:YES]; } 

到目前为止,一切都运行良好。

现在我在故事板中添加了另一个视图控制器。 使其成为初始视图控制器,在其中添加两个容器,然后将MasterViewController和DetailViewContainer嵌入这些容器中。

现在,它不是在右侧的DetailViewController中显示传递的数据,而是通过替换控制器视图显示左侧传递的数据。

如果我无法澄清我想说的话,这里是项目的链接https://jumpshare.com/v/UiTFEB6AamIo8qX9sinW ,它仅用于学习目的。

谢谢

你遇到这个问题因为你还在这样做:

 [self.navigationController pushViewController:detailViewController animated:YES]; 

您在此处引用的导航控制器是您的主控制器嵌入的导航控制器,因此您可以创建detailController的实例(不同于屏幕上已有的实例)并将其推送到导航控制器。

您想要做的是获取对已经在屏幕上的详细控制器的引用 – 两个子视图控制器(容器视图中的控制器)已经在应用程序启动时实例化。 所以,你需要这样做:

 - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { DetailViewController *detailViewController = [self.navigationController.parentViewController childViewControllers][1]; NSMutableString *object = thisArray[indexPath.row]; detailViewController.passedData = object; } 

这会将值传递给detail控制器,但是您无法让代码更新viewDidLoad中的标签,因为该视图已经加载,并且不会再次调用。 相反,覆盖passData的setter,并在那里更新标签(注意我将参数的名称更改为passInData,因此它不会与您的属性notifyData冲突):

 -(void)setPassedData:(NSString *)passedInData { passedData = passedInData; detailDescriptionLabel.text = passedData; } 

顺便说一句,除非你计划在主视图控制器之后添加其他控制器,否则根本没有理由将它嵌入导航控制器中。 如果你把它拿出来,那么当你得到对细节控制器的引用时,你需要删除对self.navigationController的引用。 那就是:

 DetailViewController *detailViewController = [self.parentViewController childViewControllers][1];