在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来处理转换,使其看起来好像消息合成视图包含在表格视图单元格中一样。