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

Posted

技术标签:

【中文标题】UITableView 在嵌入在容器中的控制器之间传递数据【英文标题】:UITableView Passing Data Between Controllers Embedded Inside Containers 【发布时间】:2013-05-05 04:03:49 【问题描述】:

我有一个简单的测试项目。嵌入在故事板导航控制器中的 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 的链接,仅供学习。

谢谢

【问题讨论】:

【参考方案1】:

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

[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];

【讨论】:

如果包含这两个容器的视图控制器本身嵌入到另一个视图控制器中并且它不保持初始视图控制器怎么办?它会起作用还是需要更多的调整? @AJ112,不,它不应该需要任何调整——该控制器仍然是嵌入在容器视图中的两个控制器的父控制器,因此您仍然可以以相同的方式引用它。跨度> 如果我有其他数据对象要传递给详细视图控制器,我可以制作更多类似于 setPassedData 的方法。对吗? @AJ112,是的,您可以覆盖其他设置器以传递更多数据。

以上是关于UITableView 在嵌入在容器中的控制器之间传递数据的主要内容,如果未能解决你的问题,请参考以下文章

嵌入在容器中的 UITableView 不刷新

将 UITableView 作为容器视图嵌入到 UIViewController 中

静态 uitableview 中的 uitextfield 不会在容器视图中更新

UIStoryboardSegue 嵌入

容器视图中的 Tableview 溢出问题

从嵌入在容器视图中的视图控制器中分离