从自定义UITableViewCell添加和删除自定义视图

时间:2014-05-14 14:43:51

标签: ios objective-c uitableview uiview

我创建了一个自定义UITableViewCellWTNCurrentLocationSearchResultCellTableViewCell

我们将API中的数据解析为数组。然后在- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath中检查数组是否为nil,然后填充数据:

WTNCurrentLocationSearchResultCellTableViewCell *searchResultCell = [tableView dequeueReusableCellWithIdentifier:searchResultCellName];
if (searchResultCell == nil) {
        searchResultCell = [[WTNCurrentLocationSearchResultCellTableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:searchResultCellName];
}
WTNAPIBusiness *business = self.apiBusinesses[indexPath.row];
searchResultCell.distanceLabel.text = [NSString stringWithFormat:@"%d %@",(int)[business.distanceFromLocation integerValue], @"meters"];

问题
我们有一个用于评级的子视图。如果您滚动到表格底部并快速返回顶部,则最后一个评级视图将显示在顶部单元格中。

我想象的是细胞正在被重复利用。根据{{​​1}}。

所以问题是,我应该在dequeueResuable...开头清理单元对象/出口吗?并且更重要的是如果我们有一个只有特定值才会显示的视图否则我们应该在这里做什么?即如果没有评级或0,我们不想显示评级视图。但是通过从superview中删除评级视图,这意味着它之后将永远不会存在于单元格中?

注意:这些是在IB中创建的自定义单元格,其对象/出口链接到自定义cellForRowAtIndex类。没有类的自定义init方法,它只是用来引用出口。

3 个答案:

答案 0 :(得分:1)

通常,您希望避免在重复使用期间更改单元格的STRUCTURE。使用静态视图集设置每种类型的单元格。然后根据数据显示/隐藏视图。

关键是您希望在tableView:cellForRowAtIndexPath:方法中完全配置单元格。如果给定视图不包含数据,请将内容设置为空或隐藏视图。不要以为细胞会空白。它不会。

不要将视图设置为nil。不要将(字符串)内容设置为nil。相反,要么将字符串内容设置为空字符串:@“”,要么将视图设置为hidden=YES

如果上面的郝所描述的代码不起作用则会出现问题。

听起来你很困惑。我建议保持简单,不要使用prepareForReuse或didEndDisplayingCell。在tableView:cellForRowAtIndexPath:方法中完成所有工作。

答案 1 :(得分:0)

当调用以下任何方法时,可以重置表视图单元格:

  • tableView:cellForRowAtIndexPath:UITableViewDataSource) - 数据源可能会在重用之前重置单元格。
  • prepareForReuseUITableViewCell) - 单元格可能会在重用之前重置。
  • tableView:didEndDisplayingCell:forRowAtIndexPath:UITableViewDelegate) - 代理可能会重置内容,一旦单元格不再可见,就必须立即清除

答案 2 :(得分:0)

是的,您需要在重新使用UITableViewCelll时检查评级视图。

WTNCurrentLocationSearchResultCellTableViewCell *searchResultCell = [tableView dequeueReusableCellWithIdentifier:searchResultCellName];
if (searchResultCell == nil) {
    searchResultCell = [[WTNCurrentLocationSearchResultCellTableViewCell alloc]   initWithStyle:UITableViewCellStyleDefault reuseIdentifier:searchResultCellName];
}
WTNAPIBusiness *business = self.apiBusinesses[indexPath.row];
searchResultCell.distanceLabel.text = [NSString stringWithFormat:@"%d %@",(int)   [business.distanceFromLocation integerValue], @"meters"];
if(SpecificValue>0){
    [searchResultCell.rateView setRate:SpecificValue];
    [searchResultCell.rateView setHidden:NO];
}else{
    [searchResultCell.rateView setHidden:YES];
}