滚动时UITableView单元格更新

时间:2012-02-10 16:33:35

标签: iphone uitableview

我正在开发一个iPhone应用程序,我有一个小问题,或者我认为。我有一个tableview,我通过返回方法中的单元格来设置单元格的颜色和标签。当我运行它时,一切似乎都很好,问题是当我将单元格的颜色更改为低于或高于单元格的颜色时。我不知道如何解决这个问题。我相信当我因某种原因滚动时更新单元格。我如何将其更改为仅设置单元格属性,而不是在滚动时?

- (UITableViewCell *)tableView:(UITableView *)tableView
         cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    tableCellCount ++;

    static NSString *SimpleTableIdentifier = @"SimpleTableIdentifier";
    UITableViewCell *cell = [tableView
                             dequeueReusableCellWithIdentifier:SimpleTableIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault
                                     reuseIdentifier:SimpleTableIdentifier];

        UIColor * lightRed = [UIColor colorWithRed:0.6 green:0.1 blue:0 alpha:1.0];
        UIColor * darkRed = [UIColor colorWithRed:0.7 green:0.1 blue:0 alpha:1.0];
        UIColor * darkGray = [UIColor colorWithRed:0.15 green:0.15 blue:0.15 alpha:1.0];

        NSLog(@"A");

        if (tableCellCount % 2 == 0) {
            cell.contentView.backgroundColor = darkRed;
            cell.detailTextLabel.backgroundColor = darkRed;
            cell.textLabel.backgroundColor = darkRed;
        } else {
            cell.contentView.backgroundColor = lightRed;
            cell.detailTextLabel.backgroundColor = lightRed;
            cell.textLabel.backgroundColor = lightRed;
        }
        cell.textLabel.textColor = [UIColor whiteColor];

        UIView *bgColorView = [[UIView alloc] init];
        [bgColorView setBackgroundColor:darkGray];
        [cell setSelectedBackgroundView:bgColorView];
    }

    NSUInteger row = [indexPath row];
    cell.textLabel.text = [listData objectAtIndex:row];

    return cell;
}

更新

我找到了解决问题的方法。

这是更新后的代码:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    static NSString *CellIdentifier = @"Cell";    
    UITableViewCell * cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault 
                                      reuseIdentifier:CellIdentifier];
    }

    NSUInteger row = [indexPath row];
    cell.textLabel.text = [[[content objectAtIndex:indexPath.section] objectForKey:@"rowValues"] 
                           objectAtIndex:indexPath.row];
    cell.imageView.image = [UIImage imageNamed:@"News_Icon@2x.png"];

    UIColor * lightRed = [UIColor colorWithRed:0.7 green:0.1 blue:0 alpha:1.0];
    UIColor * darkRed = [UIColor colorWithRed:0.6 green:0.1 blue:0 alpha:1.0];
    UIColor * darkGray = [UIColor colorWithRed:0.15 green:0.15 blue:0.15 alpha:1.0];

    if (row % 2 == 0) {
        cell.contentView.backgroundColor = darkRed;
        cell.detailTextLabel.backgroundColor = darkRed;
        cell.textLabel.backgroundColor = darkRed;
    } else {
        cell.contentView.backgroundColor = lightRed;
        cell.detailTextLabel.backgroundColor = lightRed;
        cell.textLabel.backgroundColor = lightRed;
    }
    cell.textLabel.textColor = [UIColor whiteColor];

    UIView *bgColorView = [[UIView alloc] init];
    [bgColorView setBackgroundColor:darkGray];
    [cell setSelectedBackgroundView:bgColorView];

    for(UIView *view in [tableView subviews]) {
        if([[[view class] description] isEqualToString:@"UITableViewIndex"]) {
            [view setBackgroundColor:[UIColor clearColor]];
        }
    }
    return cell;
}

3 个答案:

答案 0 :(得分:4)

对于表格中的每个单元格,只有在创建单元格时才要设置第一次的属性,并且每次都要设置其他属性。

UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:anyId];
if(cell==nil)
{
    // Properties to set the first time when the cell is created only
}
// Properties to set each time

return cell;

答案 1 :(得分:2)

您正在重复使用单元格视图。检查表视图控制器tableView:cellForRowAtIndexPath:中的方法,确定您使用的是dequeueReusableCellWithIdentifier:。您必须将颜色值设置为该重用的单元格。

答案 2 :(得分:1)

细胞被重复使用存在问题。 UITableViews回收细胞。因此,如果您在tableview:cellForRowAtIndex:方法中没有正确处理此问题,滚动时会得到奇怪的结果。始终假设您正在设置的单元格可能已设置为另一个单元格。