我有一个简单的测试项目。一个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的链接,仅用于学习目的。
由于
答案 0 :(得分: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中更新标签,因为该视图已加载,并且不会再次调用。相反,覆盖passData的setter,并在那里更新标签(请注意,我将参数的名称更改为passInData,因此它不会与您的属性passData冲突):
-(void)setPassedData:(NSString *)passedInData {
passedData = passedInData;
detailDescriptionLabel.text = passedData;
}
顺便说一下,除非您计划在主视图控制器之后添加其他控制器,否则根本没有理由将其嵌入导航控制器中。如果你把它拿出来,那么当你得到对细节控制器的引用时,你需要删除对self.navigationController的引用。那就是:
DetailViewController *detailViewController = [self.parentViewController childViewControllers][1];