Ios UITableView在嵌入容器中的控制器之间传递数据

Ios UITableView在嵌入容器中的控制器之间传递数据,ios,objective-c,uitableview,storyboard,Ios,Objective C,Uitableview,Storyboard,我有一个简单的测试项目。嵌入情节提要中导航控制器内的UITableViewController(MasterViewController)。我没有使用prepareForSegue将数据传递给另一个视图控制器(DetailViewController)。相反,didSelectRowAtIndexPath用于更新detailviewcontroller中的标签,如下所示: - (void)tableView:(UITableView *)tableView didSelectRowAtIndex

我有一个简单的测试项目。嵌入情节提要中导航控制器内的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中显示传递的数据,而是通过替换控制器视图在左侧显示传递的数据

如果我不能澄清我想说的话,这里是这个项目的链接,它只是为了学习


谢谢

您遇到这个问题是因为您仍在这样做:

[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;
}
这将把值传递给细节控制器,但您不能拥有更新viewDidLoad中标签的代码,因为该视图已经加载,不会再次调用。相反,重写passedData的setter,并在那里更新标签(注意,我将参数的名称更改为passedData,因此它不会与属性passedData冲突):

顺便说一句,除非您计划在主视图控制器之后添加其他控制器,否则考虑到这种设置,根本没有理由将其嵌入导航控制器中。如果将其取出,则在获取对详细信息控制器的引用时,需要删除对self.navigationController的引用。那就是:

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

如果包含这两个容器的视图控制器本身嵌入到另一个视图控制器中,并且不再是初始视图控制器,该怎么办?它会工作还是需要更多的调整?@AJ112,不,它不应该需要任何调整——该控制器仍然是嵌入在容器视图中的两个的父控制器,因此您仍然会以相同的方式引用它。如果我有其他数据对象要传递给细节视图控制器,我可以创建更多类似于setPassedData的方法。是吗?@AJ112,是的,您可以覆盖其他设置程序来传递更多数据。
DetailViewController *detailViewController = [self.parentViewController childViewControllers][1];