0

Раньше у меня был массив данных с большим объемом (~ 530 записей), отображаемый в виде таблицы. Данные были проведены в массиве словарей с двумя ключами, идентификатором и именем. Раньше я постучал по ячейке, добавил галочку и отправил номер строки ячейки в «selectedArray». Поскольку я уже сортировал их по алфавиту (все еще в одном разделе), indexPath.row, который был сохранен в selectedArray, соответствовал индексу массива словарей, поэтому я мог извлекать данные (идентификатор) из записи.Проверка/снятие метки таблицы с разделами

Я решил, что я разделил бы это на заголовки по алфавитному порядку (что было абсолютной болью, я не понимаю, почему именно такой сложный процесс вставляет заголовки в список записей). Но теперь, когда я использовал только indexPath.row, когда я отмечаю первый, он фиксирует первую запись каждого раздела и возвращает только число 0, поэтому я получаю только первую запись во всем наборе данных. Есть ли простой способ исправить это? Очень ценю любую помощь.

cellForRowAtIndexPath:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 

    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"inviteCell"]; 

// cell.accessoryType = UITableViewCellAccessoryCheckmark; 

    if ([checkedCells objectForKey:[NSNumber numberWithInt:indexPath.row]] != nil) { 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 
    else 
    { 
     cell.accessoryType = UITableViewCellAccessoryNone; 
    } 


// NSDictionary *friend = [sortedFriendsArray objectAtIndex:indexPath.row]; 


    //---get the letter in the current section--- 
    NSString *alphabet = [nameIndex objectAtIndex:[indexPath section]]; 
    //---get all states beginning with the letter--- 
    NSPredicate *predicate = 
    [NSPredicate predicateWithFormat:@"SELF.name beginswith[c] %@", alphabet]; 
    NSArray *states = [sortedFriendsArray filteredArrayUsingPredicate:predicate]; 
    if ([states count]>0) { 
//---extract the relevant state from the states object--- 

     NSDictionary *friend = [states objectAtIndex:indexPath.row]; 
     long long fbid = [[friend objectForKey:@"id"]longLongValue]; 
     NSString *name = [friend objectForKey:@"name"]; 

     NSString *urlString = [NSString stringWithFormat:@"https://graph.facebook.com/%qi/picture?type=square",fbid]; 
     NSURL *url = [NSURL URLWithString:urlString]; 

     UILabel *eventNameLabel = (UILabel *) [cell viewWithTag:1]; 
     eventNameLabel.text = name; 

     UIImageView *eventLogo = (UIImageView*) [cell viewWithTag:2]; 
     eventLogo.image = [UIImage imageNamed:@"112-group.png"]; 
     // eventLogo.image = [UIImage imageWithData: [NSData dataWithContentsOfURL:url]];; 

    } 

     return cell; 

} 

ТОК didSelectRowAtIndexPath:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; 
    NSNumber *indexNumber = [NSNumber numberWithInt:indexPath.row]; 
    NSDictionary *friend = [sortedFriendsArray objectAtIndex:indexPath.row]; 
    long long fbid = [[friend objectForKey:@"id"]longLongValue]; 
    NSNumber *fbidNum = [NSNumber numberWithLongLong:fbid]; 

    if ([checkedCells objectForKey:indexNumber] != nil) { 
     [checkedCells removeObjectForKey:indexNumber]; 
     cell.accessoryType = UITableViewCellAccessoryNone; 

    } 
    else 
    { 
     [checkedCells setObject:fbidNum forKey:indexNumber]; 
     cell.accessoryType = UITableViewCellAccessoryCheckmark; 
    } 


    NSLog(@"Cell Pressed: %@",indexNumber); 
    NSLog(@"FBID: %lld",fbid); 
    NSLog(@"Array: %@",checkedCells); 
} 
+0

Если вы хотите сделать вашу жизнь проще, используйте 'UILocalizedIndexedCollation' для генерации заголовков разделов. –

+0

@AlanZeino спасибо, я посмотрю. Разве это не оставит меня с той же проблемой? –

+0

Да, поэтому я не публиковал выше, как ответ на ваш вопрос, а скорее в сторону одного из ваших комментариев (re: «абсолютная боль»). –

ответ

0

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

if ([checkedCells objectForKey:[NSNumber numberWithInt:indexPath.row]] != nil) { 
    cell.accessoryType = UITableViewCellAccessoryCheckmark; 
} 
else 
{ 
    cell.accessoryType = UITableViewCellAccessoryNone; 
} 

Уже поздно, и у меня нет моего Mac, чтобы попробовать этот код, так что, возможно, мне не хватает чего-то очевидного. Я не уверен, что вы говорите только о возврате нуля ... это indexPath.row?

EDIT:

Для учета раздела в вашем массиве данных, я предлагаю хранить данные в виде словаря массивов, одной словарной шпонкой каждой буквы, с внутренним массивом, содержащим все записей начиная с этого письма. Немного сложнее получить данные, но он правильно определяет раздел.

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

+0

Да, в настоящее время я возвращаю indexPath.row только так, как это было, когда у меня не было секций. Я знаю, что мне также нужно вернуть раздел, однако, как только я это сделал, я не знаю, как получить исходную запись ячейки из большого отсортированного массива. Если это имеет смысл ... Что касается вашего второго вопроса, то да, я имею в виду, если я коснусь первой строки любого из разделов, число, добавленное в выбранный массив Cells, равно 0, что является данным. –