UITableViewCell with Checkmark, duplicating checkmarks



到目前为止,在Stack Overflow上搜索我还没有发现像我这样的情况。任何帮助都是非常感谢的:我一直看到,如果我在Person a上打了一个勾,Person H也会有一个勾,大约10个左右的人也会有一个。基本上每隔10秒它就会重复一个复选标记。

下面是我的代码:
 - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{static NSString *CellIdentifier = @"MyCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
             }
cell.textLabel.text = 
[NSString  stringWithFormat:@"%@ %@", [[myArrayOfAddressBooks objectAtIndex:indexPath.row] objectForKey:@"FirstName"],[[myArrayOfAddressBooks objectAtIndex:indexPath.row] objectForKey:@"LastName"]];
cell.detailTextLabel.text = 
[NSString  stringWithFormat:@"%@", [[myArrayOfAddressBooks objectAtIndex:indexPath.row] objectForKey:@"Address"]];
return cell;

}

在我的did select row for index path中,我有这个:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
UITableViewCell *cell;
cell = [self.tableView cellForRowAtIndexPath: indexPath];
if ([[myArrayOfAddressBooks objectAtIndex:indexPath.row] objectForKey:@"emailSelected"] != @"YES")
{    
cell.accessoryType = UITableViewCellAccessoryCheckmark;
[[myArrayOfAddressBooks objectAtIndex:indexPath.row] setValue:@"YES" forKey:@"emailSelected"];
}
else
{    
    cell.accessoryType = UITableViewCellAccessoryNone;
    [[myArrayOfAddressBooks objectAtIndex:indexPath.row] setValue:@"NO" forKey:@"emailSelected"];
}     

这是由于UITableView如何"回收"UITableViewCell以提高效率,以及当它们被选中时您如何标记您的单元格。

您需要为您在tableView:cellForRowAtIndexPath:中处理/创建的每个单元刷新/设置accessoryType值。你在myArrayOfAddressBooks数据结构中正确地更新了状态,你只需要在tableView:cellForRowAtIndexPath:

中使用这个信息
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"MyCell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier] autorelease];
    }
    NSDictionary *info = [myArrayOfAddressBooks objectAtIndex:indexPath.row];
    cell.textLabel.text = [NSString  stringWithFormat:@"%@ %@", [info objectForKey:@"FirstName"],[info objectForKey:@"LastName"]];
    cell.detailTextLabel.text = [NSString  stringWithFormat:@"%@", [info objectForKey:@"Address"]];
    cell.accessoryType = ([[info objectForKey:@"emailSelected"] isEqualString:@"YES"]) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;
    return cell;
}

另外,除非有很好的理由将状态保存为@"Yes"@"No"字符串,否则为什么不将它们保存为[NSNumber numberWithBool:YES][NSNumber numberWithBool:NO] ?当你想做比较时,这将简化你的逻辑,而不是一直使用isEqualToString:

    cell.accessoryType = ([[info objectForKey:@"emailSelected"] boolValue]) ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone;

最新更新