与可重复使用的单元格混淆(滚动后影响的单元格不正确)

时间:2012-04-12 20:16:39

标签: ios ios4 uitableview

我确定这个问题不是唯一的,但我没有找到其他来源来解决它。实际上,这些都引起了更多的困惑。如果可以的话,请轻装上阵。

问题的关键在于我想在自定义单元格的7节30行表的一个单元格中滑动(-50)UILabel。滚动后,其他几行正在移动此标签,并且随着滚动的继续,它们会继续移动得越来越远。

你会注意到负50 x坐标在2个位置进行测试。第一个,在单元格中== nil,永远不会被调用。为什么??我认为这是解决这个问题的地方。

即使单元格为零,也不确定如何调用initWithStyle(不用于自定义)或initWithCoder(在storyboard中创建)。 ??

    NSArray *a = [[userDetailData objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]];

    NSString *key = [[[a objectAtIndex:0] allKeys] objectAtIndex:0];
    NSString *value = [[a objectAtIndex:0] valueForKey:key];

    static NSString *CellIdentifier = @"MasterCell";

    UsersTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

    // If cell does not exist, create it, otherwise customize existing cell for this row
    if (cell == nil) {
        // Create cell
        cell = [[UsersTableViewCell alloc] initWithCoder:<#(NSCoder *)#>reuseIdentifier:CellIdentifier];

        // Configure cell:
        NSLog(@"Key: %@   %d, %d", key, [indexPath section], [indexPath row]);
        // Prepare the date field to move left for checkmark or ex-mark

        if ([key isEqualToString:@"Date"]) {
            CGRect frame = cell.comboLabel.frame;
            frame.origin.x -= 50;
            cell.comboLabel.frame = frame;
            NSLog(@"In Date...  minus 50");
        }
    }

    // Customize cell:
    CGRect frame = cell.comboLabel.frame;
    if ([key isEqualToString:@"Date"]) {
        frame.origin.x -= 50;
        cell.comboLabel.frame = frame;
        NSLog(@"   %d, %d\n   cell: %@\n", [indexPath section], [indexPath row], cell);
    }
    else {
        frame.origin.x += 0;
        cell.comboLabel.frame = frame;
    }

    // Reset color
    cell.comboLabel.textColor = [UIColor blackColor];

    // Set the Item
    cell.nameLabel.text = [NSString stringWithFormat: @" %@",key];
    // Give the cell an accessory indicator
    ..... continue on with logic.

1 个答案:

答案 0 :(得分:1)

单元格不是nil,因为您只是在if语句之前将其分配给可重用单元格。

我会考虑制作一个带有“Date Cell”标识符的二级原型单元格,如果您创建的单元格具有关键字“Date”,则会制作第二组可重复使用的单元格

这里:

NSArray *a = [[userDetailData objectAtIndex:[indexPath section]] objectAtIndex:[indexPath row]];

NSString *key = [[[a objectAtIndex:0] allKeys] objectAtIndex:0];
NSString *value = [[a objectAtIndex:0] valueForKey:key];

static NSString *CellIdentifier = @"MasterCell";
static NSString *DateCellIdentifier = @"Date Cell";

UsersTableViewCell *cell;

//Customize Cell

if ([key isEqualToString:@"Date"]) {

    cell = [tableView dequeueReusableCellWithIdentifier:DateCellIdentifier];
    CGRect frame = cell.comboLabel.frame;

    frame.origin.x -= 50;
    cell.comboLabel.frame = frame;
    NSLog(@"   %d, %d\n   cell: %@\n", [indexPath section], [indexPath row], cell);
}
else {
    cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    frame.origin.x += 0;
    cell.comboLabel.frame = frame;
}

// Reset color
cell.comboLabel.textColor = [UIColor blackColor];

// Set the Item
cell.nameLabel.text = [NSString stringWithFormat: @" %@",key];
// Give the cell an accessory indicator
..... continue on with logic.

事实上,如果您只是在故事板上自定义原型单元格,那么您甚至可能不需要对单元格进行大部分自定义。