UITableViewCell中的iOS容器视图

时间:2014-01-25 01:59:28

标签: ios iphone objective-c uitableview

我正在尝试在UITableView单元格中添加另一个视图控制器。我们的想法是你点击单元格,它会扩展以显示更多内容 - 一个消息传递界面。重要的是(我认为)这是由一个单独的Messaging ViewController控制的。

扩展单元格并使用适当的约束扩展单元格中的视图在Storyboard中实际上非常简单,因此我尝试通过Container将新VC添加到TableViewCell来保留故事板中的所有内容。这样我就可以在容器视图上添加约束,并从我的Messaging VC中管理内容。

这是错误:

  

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

有什么方法可以解决这个问题,或者有没有办法将视图从我的viewcontroller传递到这个tableviewcell并限制我在Storyboards中设置的配置?谢谢!

4 个答案:

答案 0 :(得分:21)

我有同样的任务并以这种方式决定:

第1步。创建子类MyCell: UITableViewCell

第2步。如果使用Self-Sizing Cells,在InterfaceBuilder中将UIView添加到MyCell,然后向所有方添加高度约束和约束。该视图需要设定单元格高度 如果没有,请跳过此步骤并使用heightForRowAtIndexPath

enter image description here enter image description here

第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

enter image description here

答案 2 :(得分:0)

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

答案 3 :(得分:-3)

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

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