TableView单元格外观问题

时间:2012-01-29 16:15:40

标签: iphone objective-c cocoa-touch

我有一个tableVIew,每个单元格高度为90.0f(高度)。我的代码;

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath
{
    return 90.0;
}

现在我删除了表格中的所有记录。单元格的高度缩小到默认值44(我认为)。

1。)我的问题是,即使用户删除了所有记录,我仍需要将单元格的高度保持为90.0f。我怎么能以编程方式做到这一点?

2。)我给了我的细胞两种颜色。

cell.contentView.backgroundColor = indexPath.row % 2 ? [UIColor whiteColor] : [UIColor blackColor] ;

当我删除第二个单元格(黑色)时,第一个和第三个单元格都是白色的。我怎么能在订单中重新安排这个黑白分明。

修改

确定这有效,但是当我尝试删除表格中的最后一条记录时[tableview indexPathsForVisibleRows]我最终导致断言失败

-[UITableView _endCellAnimationsWithContext:], /SourceCache/UIKit_Sim/UIKit-1448.89/UITableView.m:961

Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: 'Invalid update: invalid number of rows in section 0. Attempt to delete more rows than exist in section.'

这是为什么?

CODE:

[self.tableView beginUpdates];

        [self.myArray removeObjectsInArray:discardedItems ]; 

        [self.tableView deleteRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil]  withRowAnimation:YES];     

[self.tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:indexPath, nil]  withRowAnimation:YES];  

        [self.tableView endUpdates];

3 个答案:

答案 0 :(得分:1)

1)我认为你不能那样做。一种方法是显示x个空白单元格以填充页面。

2)删除单元格后调用[tableView reloadData],或者在删除单元格之前和之后的行上调用[tableView reloadCellAtIndex ...]。

答案 1 :(得分:1)

如果您的行的高度非常静态(如您所示),请考虑不实施tableView:heightForRowAtIndexPath:,而是使用表格视图的rowHeight属性。 这可以在代码中或在Interface Builder中设置,并且应该是“如果没有”行就会缩小行的解决方案。

你的第二个问题:
你知道-[UITableView indexPathsForVisibleRows]吗?

您可以使用此选项仅重新加载需要更新的表视图部分。它会是这样的:

- tableView:(UITableView *)table commitEditingStyle:(UITableViewCellEditingStyle)style forRowAtIndexPath:(NSIndexPath *)path
{
   NSArray *visibleCellPaths = [table indexPathsForVisibleRows];

   // replace this comment with whatever else needs to be done in any case...

   if (style == UITableViewCellEditingStyleDelete) {
      // replace this comment with the deletions of the model object

      NSUInteger affectedPathIndex = [visibleCellPaths indexOfObject:path];
      NSMakeRange updateRange = NSMakeRange(affectedPathIndex, [visibleCellPaths count] - affectedPathIndex);
      NSArray *cellPathsToReload = [visibleCellPaths subarrayWithRange:updateRange];

      // replace this comment with the bounds-checking.
      // e.g. if you only had one section and the backing store was an array, it may look like this:
      // while ([self.backingStore count] <= [[cellPathsToReload lastObject] row]) {
      //    NSUInteger remainingPathCount = [cellPathsToReload count];
      //    if (remainingPathCount) break;
      //    cellPathsToReload = [cellPathsToReload subarrayWithRange:NSMakeRange(0, remainingPathCount - 1)];
      // }

      [table reloadRowsAtIndexPaths:cellPathsToReload withRowAnimation:UITableViewRowAnimationFade];
   }

}

答案 2 :(得分:0)

  1. 设置rowHeight的{​​{1}}属性。
  2. 文档说明:

      

    接收器中每行(表格单元格)的高度。

    1. 请为您提供数据源代码