将dequeueReusableCellWithIdentifier与自定义UITableViewCell一起使用

时间:2011-12-14 16:43:17

标签: iphone uitableview

所以我不确定这个dequeueReusableCellWithIithntifier是如何工作的,以及我正在寻找什么是可能的。我有一个带BOOL showIcon的自定义UITableViewCell。在TableViewCell中,如果它是真的,我会显示它,否则,我不会在我的单元格上显示此图标。在我的cellForRowAtIndexPath中,我从模型中获取数组中的对象,并将其设置为UITableViewCell属性。

这首先适用于我的屏幕上可见的内容。然后,当我向下滚动表格时,它不起作用,我应该看到的showIcon值不显示。然后当我滚动回到顶部时,那里的原始图标不在那里。在这种情况下,dequeueReusableCellWithIdentifier仍然是我想要使用的吗?或者我在设置和显示数据时做错了什么?谢谢一堆。

CODE:

在我的自定义UITableViewCell上,我有一个

BOOL showIcon;

在我的cellForRowAtIndexPath方法中,我使用UINib方式获取我的自定义UITableViewCell:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSUInteger row = [indexPath row];
    static NSString *OrderTableViewCellIdentifier = @"OrderTableViewCellIdentifier";
    OrderTableViewCell *cell = (OrderTableViewCell *)[tableView dequeueReusableCellWithIdentifier:OrderTableViewCellIdentifier];
    if (cell == nil) {
        UINib *cellNib = [UINib nibWithNibName:@"OrderTableViewCell" bundle:nil];
        [cellNib instantiateWithOwner:self options:nil];
        cell = self.TbvCell;
        [cell.CheckmarkButton addTarget:self action:@selector(CheckmarkButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
        self.TbvCell = nil;
    }
    Order *order = [orderArray objectAtIndexPath:row];
    cell.order = order;
 }

然后在我的TableViewCell中,它是这样的:

@property (nonatomic, retain) Order *order;
@property (nonatomic, retain) UIImageView *icon;

重写了setter:

- (void)setOrder:(Order *)newOrder {
    if (!order.showIcon) {
        icon.hidden = YES;
    } 
}

2 个答案:

答案 0 :(得分:0)

是的,dequeueReusableCellWithIdentifier适用于任何自定义UITableViewCell子类。但是,请记住,此方法用于保存内存,因此您必须执行以下操作(即使没有子类,正常的UITableViewCells): 此方法返回已使用的UITableViewCell实例(如果表视图还没有足够的单元格,则返回nil)。这意味着细胞不会“空”;你需要清除并重新设置它的所有属性。例如,您需要能够从单元格的相应NSIndexPath中确定其图标是否必须是displayad,以及您想要使用的图标图像。 所以编辑你的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
  NSUInteger row = [indexPath row];
  static NSString *OrderTableViewCellIdentifier = @"OrderTableViewCellIdentifier";
  OrderTableViewCell *cell = (OrderTableViewCell *)[tableView dequeueReusableCellWithIdentifier:OrderTableViewCellIdentifier];
  if (cell == nil) {
      UINib *cellNib = [UINib nibWithNibName:@"OrderTableViewCell" bundle:nil];
      [cellNib instantiateWithOwner:self options:nil];
      cell = self.TbvCell;
      [cell.CheckmarkButton addTarget:self action:@selector(CheckmarkButtonPressed:) forControlEvents:UIControlEventTouchUpInside];
      self.TbvCell = nil;
  }
  // set your cell's properties to default values.
  // e. g.: cell.showIcon = NO; and so on
  Order *order = [orderArray objectAtIndexPath:row];
  cell.order = order;
  // then do a recustomization using the NSIndexPath's -row and -section properties

}

希望这会有所帮助。

答案 1 :(得分:0)

您的代码重用了您的单元格,因此您必须覆盖setOrder方法中的所有情况。试试:

- (void)setOrder:(Order *)newOrder {
    if (!order.showIcon) {
        icon.hidden = YES;
    } 
    else {
        icon.hidden = NO;
    }
}

或更简单:

- (void)setOrder:(Order *)newOrder {
    icon.hidden = !order.showIcon;
}