Это связано с тем, как UITableView
«перерабатывает» UITableViewCell
в целях эффективности, и с тем, как вы отмечаете свои ячейки, когда они выбраны.
Вам необходимо обновить / установить значение accessoryType
для каждой ячейки, которую вы обрабатываете / создаете в tableView:cellForRowAtIndexPath:
.Вы корректно обновляете состояние в своей структуре данных 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;