在UITableViewCell中的iOS容器视图

我想在UITableView单元格中添加另一个视图控制器。 这个想法是,你点击单元格,并展开显示更多的内容 – 消息传递界面。 这是重要的(我认为)这是由一个单独的消息传递ViewController控制。

展开单元格并使单元格内部的视图展开,并且具有适当的约束条件,在Storyboard中实际上是非常简单的,所以我试图通过Container将我的新VC添加到TableViewCell中,从而将所有内容保留在Storyboard中。 这样我可以在容器视图上添加约束条件,并从我的Messaging VC中传输内容。

这是错误:

非法configuration:容器视图不能放置在运行时重复的元素中。

任何方式来解决这个问题,或者有什么办法,我可以pipe从我的viewcontroller的视图到这个tableviewcell,并限制到我在故事板设置的configuration? 谢谢!

我有同样的任务,并决定这样做:

第1步。创build子类MyCell: UITableViewCell

第二步:如果你使用Self-Sizing Cells ,在InterfaceBuilder中添加UIView到MyCell,然后为所有的边添加高度约束和约束。 这个视图需要设置单元格的高度。
如果不是,跳过这一步并使用heightForRowAtIndexPath

在这里输入图像说明 在这里输入图像说明

第3步。在MyCell.h中添加视图高度约束和控制器属性:

 @interface MyCell: UITableViewCell @property (weak, nonatomic) MessagingVC *controller; @property (weak, nonatomic) IBOutlet NSLayoutConstraint *viewHeight; @end 

第4步。cellForRowAtIndexPath添加代码:

 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { MyCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell" forIndexPath:indexPath]; // adjust this for your structure cell.controller = [[UIStoryboard storyboardWithName:@"MessagingVC" bundle:nil] instantiateInitialViewController]; [self addChildViewController:cell.controller]; [cell.controller didMoveToParentViewController:self]; [cell.contentView addSubview:cell.controller.view]; // if you use Self-Sizing Cells cell.viewHeight.constant = 200; // set your constant or calculate it return cell; } 

第5步。添加didEndDisplayingCell方法:

 - (void)tableView:(UITableView *)tableView didEndDisplayingCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath { if ([cell isKindOfClass:[MessagingVC class]]) [((MyCell*)cell).controller removeFromParentViewController]; } 

使您的UITableViewController内容为Static

在这里输入图像说明

您可以将容器视图拖到故事板中的UITableVeiw中。 例如,您可以在原型单元格之前拖动它,您将在原型单元格之前看到容器的视图控制器。 顺便说一句,你可以拖动任何UI元素到表视图。 我不确定,在组合表视图+容器视图中如何处理自动布局,可能需要在运行时手动计算/设置约束。 当我find关于自动布局的正确解决scheme时,将更新我的答案。

在表格视图单元格中放置容器视图太重了。 表格视图单元格应该是轻量级的,这样用户可以快速滚动它们。 没有必要把整个视图控制器放在每个单元格中。 单元格应该只代表该行的一些数据。

当用户触摸单元格时,只需使用正常的继续到消息传递视图控制器。 它的演示将是自动的。 然后创build并指定一个animationController来处理转换,使其看起来好像消息合成视图包含在表格视图单元格中一样。