我正在尝试在UITableView单元格中添加另一个视图控制器。我们的想法是你点击单元格,它会扩展以显示更多内容 - 一个消息传递界面。重要的是(我认为)这是由一个单独的Messaging ViewController控制的。
扩展单元格并使用适当的约束扩展单元格中的视图在Storyboard中实际上非常简单,因此我尝试通过Container将新VC添加到TableViewCell来保留故事板中的所有内容。这样我就可以在容器视图上添加约束,并从我的Messaging VC中管理内容。
这是错误:
非法配置:容器视图不能放在运行时重复的元素中。
有什么方法可以解决这个问题,或者有没有办法将视图从我的viewcontroller传递到这个tableviewcell并限制我在Storyboards中设置的配置?谢谢!
答案 0 :(得分:21)
我有同样的任务并以这种方式决定:
第1步。创建子类MyCell: UITableViewCell
。
第2步。如果使用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.contentView addSubview:cell.controller.view];
[cell.controller didMoveToParentViewController:self];
// 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];
}
答案 1 :(得分:1)
将UITableViewController
内容设为Static
。
答案 2 :(得分:0)
您只需将容器视图拖到故事板中的UITableVeiw即可。例如,您可以在原型单元格之前拖动它,并且您将在原型单元格之前看到容器的视图控制器。顺便说一下,您可以将任何UI元素拖到表视图中。我不确定,如何在组合表视图+容器视图中处理autolayout,也许你需要在运行时手动计算/设置约束。当我找到关于autolayout的正确解决方案时,会更新我的答案。
答案 3 :(得分:-3)
将容器视图放在表格视图单元格中太重了。表视图单元格应该是轻量级的,以便用户可以快速滚动它们。没有必要将整个视图控制器放在每个单元中。单元格应该只代表该行的一些数据。
当用户触摸单元格时,您只需使用正常的segue到消息传递视图控制器。它的演示将是自动的。然后创建并指定一个animationController来处理转换,使其看起来好像消息组合视图包含在表视图单元格中。