2014-04-20 6 views
0

У меня есть странная проблема выбора uitableview. Попытка использовать множественный выбор с предварительно выбранными ячейками. Для множественного выбора установлено значение true.UITableView selection - множественный выбор

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:nil]; 
    cell.textLabel.font = [UIFont systemFontOfSize: 15.0f]; 
    cell.textLabel.text = [data objectAtIndex:indexPath.row]; 

    // if([_selectedInts containsObject:[NSNumber numberWithInt:(int)indexPath.row]]){ 
    // 
    //  [cell setSelected:YES animated:NO]; 
    // 
    // } else { 
    // 
    //  [cell setSelected:NO animated:NO]; 
    // 
    // } 


    return cell; 
} 



-(void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath{ 

    cell.selectionStyle = UITableViewCellSelectionStyleGray; 
    [cell setUserInteractionEnabled:YES]; 


    if([_selectedInts containsObject:[NSNumber numberWithInt:(int)indexPath.row]]){ 

     [cell setSelected:YES animated:YES]; 
     [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    } else { 

     [cell setSelected:NO animated:YES]; 
     [cell setAccessoryType:UITableViewCellAccessoryNone]; 
    } 

} 

Когда TableView загружает кучу клеток выбраны из-за списка целых чисел, обозначающих индексы, которые должны быть выбраны.

Эти клетки перестают быть отзывчивыми и не вызывают методы didselect и diddeselect при получении звука.

В чем проблема?

ответ

1

я не уверен, почему положить этот код в willDisplayCell причине, чтобы это произошло, но я нашел то же самое, когда я пробовал ваш код. Ввод кода в cellForRowAtIndexPath: работал, если я использовал selectRowAtIndexPath: анимированный: scrollPosition: вместо setSelected: (ячейки не отображали цвет выделения, если я использовал setSelected :, но они были отзывчивыми). Таким образом, этот код работал, чтобы показать галочки и цвет выбора, и правильно изменил это состояние при выборе или снятии выделения с других ячеек. Обратите также внимание на то, что я деактивирую ячейки, поскольку это более эффективно с точки зрения памяти, чем способ создания ваших ячеек,

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"]; 
    cell.textLabel.font = [UIFont systemFontOfSize: 15.0f]; 
    cell.textLabel.text = [data objectAtIndex:indexPath.row]; 

    if([_selectedInts containsObject:@(indexPath.row)]){ 
     [tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionNone]; 
     [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; 
    } else { 
     [cell setAccessoryType:UITableViewCellAccessoryNone]; 
    } 
    return cell; 
} 


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 
    [self.selectedInts addObject:@(indexPath.row)]; 
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
} 


-(void)tableView:(UITableView *)tableView didDeselectRowAtIndexPath:(NSIndexPath *)indexPath { 
    [self.selectedInts removeObject:@(indexPath.row)]; 
    [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; 
} 
+0

awesome! огромное спасибо – stackOverFlew

0

В методе cellForRowAtIndexPath вам действительно нужно создавать новую ячейку, когда ячейки видны?

Давайте попробуем, это лучшая практика рекомендованных Apple:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
static NSString *CellIdentifier = @"Cell"; 
UITableViewCell *cell = (UITableViewCell*)[tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
if (cell == nil) { 
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
} 
cell.textLabel.text = @"a"; 
return cell; 
} 

Надеется, что это помогает вам

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