2012-04-18 2 views
2

Я использую табличное представление с разделами и несколькими выделениями, но у меня есть проблема с проверкой нескольких строк при выборе одной строки ... Я видел несколько другие темы по этому поводу, но на самом деле не получить решение ...iOS: множественный выбор в Tableview - AccessoryCheckmark проверка многократных ячеек

Вот мой код:

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *) indexPath 
{  
    [employeeTable deselectRowAtIndexPath:[employeeTable indexPathForSelectedRow] animated:NO]; 

    UITableViewCell *cell = [employeeTable cellForRowAtIndexPath:indexPath];  

    // get the letter in each section 
    NSString *alphabet = [charIndex objectAtIndex:indexPath.section]; 

    // get the names beginning with the letter 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet];  

    NSArray *names = [listOfNames filteredArrayUsingPredicate:predicate];  

    NSString *name = [names objectAtIndex:indexPath.row]; 

    for(int i = 0; i < [employeeConnection.employees count]; i++) 
    { 
     Employee *aEmployee = [employeeConnection.employees objectAtIndex:i]; 

     NSString *firstName = aEmployee.firstName; 
     NSString *lastName = aEmployee.lastName; 
     NSString *fullName = [NSString stringWithFormat:@"%@ %@", firstName, lastName]; 

     if([fullName isEqualToString:name]) 
     { 
      NSLog(@"Name: %@", name); 

      if (cell.accessoryType == UITableViewCellAccessoryNone) { 

       cell.accessoryType = UITableViewCellAccessoryCheckmark; 

       // Reflect selection in data model 
       [chosenEmployees addObject:aEmployee.employeeID]; 
       [chosenEmployeesNames addObject:name]; 

      } else if (cell.accessoryType == UITableViewCellAccessoryCheckmark) { 

       cell.accessoryType = UITableViewCellAccessoryNone; 

       // Reflect deselection in data model 
       [chosenEmployees removeObject:aEmployee.employeeID]; 
       [chosenEmployeesNames removeObject:name]; 
      } 
     } 
    } 
} 

Обновление: Добавлено cellForRowAtIndexPath

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifier]; 

     cell.textLabel.textColor = [UIColor whiteColor]; 
    } 

    // Get the letter in the current section 
    NSString *alphabet = [charIndex objectAtIndex:[indexPath section]]; 

    // Get the names beginning with the letter 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF beginswith[c] %@", alphabet]; 
    NSArray *names = [listOfNames filteredArrayUsingPredicate:predicate]; 

    if([names count] > 0) 
    { 
     // Extract the name 
     cell.textLabel.text = [names objectAtIndex:indexPath.row]; 
    } 

    return cell; 
} 
+0

Это только повторно используемые ячейки, которые проверяются, когда вы не хотите их? Как в момент прокрутки? – larsacus

+0

У меня около 14 строк, разделенных на разделы ... Когда я выбираю, например, первую строку, также выбирается еще одна строка в другой секции ... (Разделы - A: 1 (я проверяю эту строку), C: 1 строка: D: 1, H: 2, J: 2, K: 1 (это также проверено) M: 2, P: 1, S: 1, T: 2) ... – user969043

+0

У вас будет чтобы опубликовать код 'cellForRowAtIndexPath:' или какой-либо метод, который вы настраиваете для ячеек для отображения. – larsacus

ответ

10

Я бы предложил хранить NSMutableSet либо проверенного ManagedObject (при использовании CoreData), либо только проверенных IndexPaths. In-cellForRowAtIndexPath: вы можете проверить, должна ли ячейка быть проверена.

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *const identifier = @"Cell"; 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; 
    if (cell == nil) { 
     cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier]; 
     cell.textLabel.textColor = UIColor.whiteColor; 
    } 

    if ([self.checkedIndexPaths containsObject:indexPath]) { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
    else { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 

    return cell; 
} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *const cell = [tableView cellForRowAtIndexPath:indexPath]; 
    [table deselectRowAtIndexPath:indexPath animated:NO]; 

    if ([self.checkedIndexPaths containsObject:indexPath]) { 
     [self.checkedIndexPaths removeObject:indexPath]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 
    else { 
     [self.checkedIndexPaths addObject:indexPath]; 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
} 
+0

Спасибо, работал как шарм! – user969043

+0

Рад, что я мог бы помочь. Но помните, что сохранение 'indexPath' может быть проблематичным при вставке строк и т. Д. ... в этом случае было бы более полезно отслеживать проверенные объекты *, представленные * ячейками. –

+0

@Jenox. Его работа, но когда я просматриваю таблицу, выбранные галочки исчезают. –

0

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

Таким образом, свойство cell.accessoryType для ячеек должно быть исправлено в cellForRowAtInexPath, а не в деле делекторе didSelectRow.

В didSelectRow просто отслеживайте выбранные строки в массиве и устанавливайте метку аксессуаров ячеек в none или checkmark в cellForRowAtInexPath в зависимости от значения массива.

+0

Ваша идея будет работать, но разве вы не думаете, что «NSSet» более полезен, чем «NSArray» в этом случае? –

+0

Я не знаю, почему NSSet предоставит преимущество в этом случае, но да, это также отлично работает. – Lefteris

+0

Вы используете 'array', если порядок объектов * имеет значение *, и' set', если он делает * not *. ;) –

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