0

我有一个简单的测试项目。嵌入在故事板导航控制器中的 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,它只是为了学习目的。

谢谢

4

1 回答 1

2

您遇到此问题是因为您仍在执行此操作:

[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的设置器,并在那里更新标签(请注意,我将参数的名称更改为passedInData,因此它不会与您的属性passedData冲突):

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

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

DetailViewController *detailViewController = [self.parentViewController childViewControllers][1];
于 2013-05-05T04:20:38.063 回答