2013-06-06 2 views
1

У меня есть UITableView, где пользователь должен иметь возможность выбирать (проверять) несколько строк.UITableView не отменяет первую выбранную строку

У меня есть NSMutableArray в контроллере для хранения выбранных элементов, а в моем методе cellForRowAtIndexPath я проверяю, находится ли элемент в этом массиве и соответственно возвращает ячейку в контролируемое/неконтролируемое состояние.

Вот код:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = kContactCellReuseIdentifier; 
    static NSString *searchIdentifier = kContactSearchCellReuseIdentifier; 

    POContactCell *cell; 

    // Configure the cell... 
    if (tableView == self.tableView) { 
     cell = (POContactCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier forIndexPath:indexPath]; 
     cell.contact = self.contacts[indexPath.row]; 
     NSLog(@"Returned cell with name %@", cell.contact.name); 
    } else { 
     cell = (POContactCell*)[tableView dequeueReusableCellWithIdentifier:searchIdentifier forIndexPath:indexPath]; 
     cell.contact = self.searchResults[indexPath.row]; 
    } 

    if ([self.selectedContacts containsObject:cell.contact]) 
    { 
     NSLog(@"was checked"); 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
    else 
     cell.accessoryType = UITableViewCellAccessoryNone; 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    POContactCell* tappedCell = (POContactCell*)[self tableView:tableView cellForRowAtIndexPath:indexPath]; 

    NSLog(@"Selected contact %@", tappedCell.contact.name); 
    if ([self.selectedContacts containsObject:tappedCell.contact]) { 
     // cell is already selected, so deselect it 
     NSLog(@"It's already selected, so deselect it"); 
     [self.selectedContacts removeObject:tappedCell.contact]; 
     tappedCell.accessoryType = UITableViewCellAccessoryNone; 
    } 
    else 
    { 
     NSLog(@"It's not already selected, so select it"); 
     [self.selectedContacts addObject:tappedCell.contact]; 
     tappedCell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 

    [tableView reloadRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:NO]; 
} 

Этот код работает ... для первого выбора, кроме. Первая ячейка, в которой пользовательские метчики будут проверяться и никогда не будет отключена. Я вижу из операторов журнала, что все ячейки проходят через один и тот же процесс, и он правильно распознает состояние выбора первой резьбовой строки, даже если аксессуар не отражает ее.

После первого выбора все остальные ряды работают отлично.

Любые идеи по отладке?

ответ

0

Вы должны поместить self.contacts[indexPath.row] (или self.searchResults[indexPath.row], если необходимо) в свой массив выбранных элементов и проверить, существуют или нет эти объекты в массиве, когда пользователь удаляет ячейку. Вы почти делаете это, казалось бы, установив cell.contact объекту из вашего источника данных и проверив cell.contact в вашем массиве. Но я бы поставил объект прямо в ваш массив, например.

id contact = self.contacts[indexPath.row]; 
if ([self.selectedContacs containsObject:contact]) 
    ... 

и остановить проверку, если cell.contact в массиве, чтобы определить «выбранный-Несс».

В UITableView имеется небольшой набор фактических UITableViewCell объектов в памяти, и они снова используются. Корень вашей проблемы вполне может быть таким, потому что вы проверяете, есть ли cell.contact в вашем наборе выбранных предметов; когда ячейка повторно используется, если вы не написали свой собственный prepareForReuse, предыдущее значение ваших пользовательских атрибутов может не быть (вероятно, не будет) очищено.

Это имеет смысл?

+0

Я просто пробовал работать только с массивом self.contacts. Все еще такая же проблема. – Shinigami

+0

Вы изменили код в 'didSelectRowAtIndexPath:', чтобы вытащить контакт из соответствующего массива (self.contacts или self.searchResults), а затем проверить, находится ли этот объект в вашем массиве выбранных элементов? –

+0

Да, теперь 'didSelectRowAtIndexPath:' имеет 'self.contacts [indexPath.row]' для проверки сдерживания или добавления/удаления файлов. Но все тот же результат. – Shinigami

Смежные вопросы