iOS 8 - UITableViewCell中的动态内容

时间:2015-06-08 18:34:55

标签: ios uitableview

我正在尝试使用X个单元格创建一个UITableView。每个单元格可以有2到20多个视图,但视图的数量不应该是硬编码的。

因此第一个UITableViewCell可能只有3个标签,而第二个UITableViewCell可能有6个标签。

我该如何实现?我只是在显示内容时遇到困难,并且UITableView的高度正确。

我目前的解决方案是在方法中生成内容(因为我无法在init方法中生成),然后在将信息传递给单元格后将子视图添加到contentView。到目前为止,这会产生不良结果(细胞的高度不能正确计算)。

这是UITableViewCell生成内容的方法。

- (void) generateContent
{

    // Simplifying the code, but this section will be hooked up with a property on the UITableViewCell to generate the content
    UIView *pmv = [[[NSBundle mainBundle] loadNibNamed:@"PortalModuleView"
                                                      owner:self
                                                    options:nil] objectAtIndex:0];

    UIView *pmv2 = [[[NSBundle mainBundle] loadNibNamed:@"PortalModuleView"
                                                      owner:self
                                                    options:nil] objectAtIndex:0];
    // add the views
    [self.contentView addSubview:pmv];
    [self.contentView addSubview:pmv2];

    // add in some constraints


}
这是UITableView的数据源
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//    static NSString *CellIdentifier = @"Cell";

    ViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[ViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    [cell generateContent];
    return cell;
}

- (CGFloat)tableView:(UITableView *)tableView estimatedHeightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 100;
}

问题是单元格没有生成我想要的内容(我认为这是由于高度不好;约束依赖于高度正确)。我认为主要原因只是在生成视图之前,单元格无法生成正确的高度。

我已尝试使用reloadRowsAtIndexPath,但它并未修复所有行的问题。

1 个答案:

答案 0 :(得分:0)

您必须编写自己的UITablewViewController,以编程方式处理所有这些。 UITableViewController类中有许多方法可以覆盖以修改表内容。

例如,您可以像这样更改单元格高度:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
   switch (indexPath.section)
   {
       case 0: // first section
       {
           switch (indexPath.row)
           {
               // first row of first section height
               case 0: return 48.0f;
               default: NSAssert(NO, @"Invalid row %d", (int)indexPath.row);
           } 
       } break;

       default: NSAssert(NO, @"Invalid section %d", (int)indexPath.section);
   }
}

接下来,你将覆盖cellForRowAtIndexPath& willDisplayCell -functions。如果您不想以编程方式生成视图,则可以始终在storyboard-view中设计单元格原型,并以编程方式填充内容:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
   UITableViewCell* cell = nil;
   NSString* cellID = nil;
   switch (indexPath.section)
   {
      case 0: cellID = MY_CELL_ID_FOR_CELLS_IN_SECTION_1; break;
      case 1: cellID = MY_CELL_ID_FOR_CELLS_IN_SECTION_2; break;
      default: NSAssert(NO, @"Invalid section %d", (int)indexPath.section); break;
   }
   if (cellID != nil)
   {
      cell = [tableView dequeueReusableCellWithIdentifier:cellID];
   }
   return cell;
}

- (void) tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath
{
   switch (indexPath.section)
   {
      case 0:
      {
          switch (indexPath.row)
          {
             case 0:
             {
                // Say your cell prototype has label with tag=1; You can fill the content like this:
                [(UILabel*)[cell viewWithTag:1] setText:@"Hello!"];
             } break;
          }
      } break;
   }
}

有关详细信息,请参阅UITableViewController class reference