UITableViewCell内的UITableView子视图不会显示

时间:2016-01-19 00:15:01

标签: ios uitableview

我正在尝试创建一个UITableview,其中每个单元格包含另一个UITableView。它基本上是2-3行的列表,其中每行都有一个2-3行的子列表。

主ViewController的行为与任何其他TableViewController一样,并且在cellForRowAtIndexPath中,它尝试添加具有动态高度的SubTableViewController.view。 SubTableViewController是第二个tableview,每个都有自己的Datasource。

我遇到的问题是SubTableViewController似乎使用调试器正确呈现,具有正确的数据和单元格数,但它在呈现时根本不显示。我注意到它的ViewDidAppear中的contentSize高度为“0”,尽管高度产生了2行以上。该项目使用AutoLayout,但SubTableViewController的框架在添加时以编程方式设置。

我可以做些什么来让某些东西出现在这里?

数据结构(期间是subTable)

[{name:"activity 1",
  periods:[{name:"period1",desc:"desc1"},
           {name:"period2",desc:"desc2"},
           {name:"period3",desc:"desc3"}
          ]
 },
 {name:"activity 2",
  periods:[{name:"period1",desc:"desc1"},
           {name:"period2",desc:"desc2"},
           {name:"period3",desc:"desc3"}
          ]
 }]

的ViewController

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {
    return [_data count];
}

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];

    UIImageView *imageView = (UIImageView*)[cell viewWithTag:1];
    UIView *subTableView = (UIView*)[cell viewWithTag:3];

    return imageView.frame.size.height + subTableView.frame.size.height + 20;

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    static NSString *MyIdentifier = @"tableViewCell";

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier];
    if (cell == nil){
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier];
    }
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    ActivityModel *model = _data[indexPath.row];

    UILabel *nameLabel = (UILabel*)[cell viewWithTag:2];
    nameLabel.text = model.name;

    UIView *internalView = (UIView*)[cell viewWithTag:10];

    SubTableViewController *subTableViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"SubTableViewController"];
    subTableViewController.activityModel = model;
    subTableViewController.view.tag = 3;
    subTableViewController.view.frame = CGRectMake(0,
                                                   60,
                                         internalView.frame.size.width,                                        
                       subTableViewController.view.frame.size.height);
    [internalView addSubview:subTableViewController.view];
    [internalView bringSubviewToFront:subTableViewController.view];
    [subTableViewController.tableView reloadData];


    return cell;
}

SubTableViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    // Do any additional setup after loading the view.
}

-(void)viewWillAppear:(BOOL)animated {
    [super viewWillAppear:animated];


    int height = 0;
    for (int section = 0; section < [self numberOfSectionsInTableView:_tableView]; section++){
        for(int row = 0; row < [self tableView:_tableView numberOfRowsInSection:section]; row++){
            height += [self tableView:_tableView heightForRowAtIndexPath:[NSIndexPath indexPathForItem:row inSection:section]];
        }
    }

    CGRect tableFrame = self.tableView.frame;
    tableFrame.size.height = height;
    self.tableView.frame = tableFrame;

    CGRect viewFrame = self.view.frame;
    viewFrame.size.height = height;
    self.view.frame = viewFrame;
    [self.view bringSubviewToFront:_tableView];

    // [self.tableView layoutIfNeeded];
    // [self.tableView setNeedsDisplay];
    // [self.tableView reloadData];
    // _tableView.contentSize = CGSizeMake(600, 52);

    self.view.backgroundColor = [UIColor redColor];
    self.tableView.backgroundColor = [UIColor blueColor];

    self.tableView.hidden = NO;
}

-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
    return 1;
}
-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return [_activityModel.periods count];
}
-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [self tableView:tableView cellForRowAtIndexPath:indexPath];
    UILabel *nameLabel = (UILabel*)[cell viewWithTag:3];
    UITextView *textView = (UITextView*)[cell viewWithTag:5];

    float textViewHeight = [textView.text sizeWithFont:[UIFont systemFontOfSize:13] constrainedToSize:CGSizeMake([UIScreen mainScreen].bounds.size.width - 40, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping].height;

    return nameLabel.frame.size.height + textViewHeight + 20;

}

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"tableViewCell"];
    cell.selectionStyle = UITableViewCellSelectionStyleNone;

    PeriodModel *model = _activityModel.periods[indexPath.row];

    UILabel *nameLabel = (UILabel*)[cell viewWithTag:3];
    UILabel *durationLabel = (UILabel*)[cell viewWithTag:4];
    UITextView *textView = (UITextView*)[cell viewWithTag:5];

    nameLabel.text = model.name;
    durationLabel.text = [NSString stringWithFormat:@"%d minutes", (int)(model.durationSeconds/60)];

    textView.text = model.description;

    textView.textContainerInset = UIEdgeInsetsZero;
    textView.textContainer.lineFragmentPadding = 0;
    textView.scrollEnabled = NO;

    CGRect frame = textView.frame;
    frame.size.height = [textView.text sizeWithFont:[UIFont systemFontOfSize:12] constrainedToSize:CGSizeMake(cell.contentView.frame.size.width, MAXFLOAT) lineBreakMode:NSLineBreakByWordWrapping].height;
    textView.frame = frame;

    return cell;
}

模拟器图像。标题是外部UITableCell,红色下面是添加的SubTableViewController.view。 UITableView应该覆盖红色,但这里根本没有出现。它不是隐藏在下面等等。

enter image description here

1 个答案:

答案 0 :(得分:1)

不要在您的单元格中放置表格视图。

为您描述的用途执行此操作几乎没有任何好处。使用部分和行。每个部分都是您当前的单元格。该部分中的每一行都是当前嵌入表视图中的一行。

此外,如果您的内部表视图具有不同的大小,则需要计算每个外部单元的所有内部单元格高度。这正是部分和行所发生的情况,但您作为开发人员只需要担心行,UITableView将处理部分大小调整。