2013-09-20 2 views
8

Редактировать: Решение этого ответа связано с iOS7 иногда возвращаются NSIndexPath и другие времена возвращения NSMutableIndexPath. Проблема не была связана с begin/endUpdates, но, надеюсь, решение поможет некоторым другим.IOS 7 beginUpdates endUpdates несовместимым


Все - я бег моего приложения на прошивке 7, и я бег в проблемы с beginUpdates и endUpdates методами для UITableView.

У меня есть табличное представление, которое необходимо изменить при изменении высоты ячейки. Ниже мой код:

- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 

     // If our cell is selected, return double height 
     if([self cellIsSelected:indexPath]) { 
      return 117; 
     } 

     // Cell isn't selected so return single height 
     return 58; 

} 

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath{ 

     ChecklistItemCell *cell = (ChecklistItemCell *)[self.tableview cellForRowAtIndexPath:indexPath]; 
     [cell.decreaseButton setHidden:NO]; 
     [cell.increaseButton setHidden:NO]; 

     // Toggle 'selected' state 
     BOOL isSelected = ![self cellIsSelected:indexPath]; 

     DLog(@"%@", selectedIndexes); 

     DLog(@"is selected: %@", isSelected ? @"yes":@"no"); 
     // Store cell 'selected' state keyed on indexPath 
     NSNumber *selectedIndex = @(isSelected); 
     selectedIndexes[indexPath] = selectedIndex; 

     [tableView beginUpdates]; 
     [tableView endUpdates]; 

} 

В beginUpdates и endUpdates методы работают довольно непоследовательно. Метод didSelectRowAtIndexPath вызывается правильно при каждом касании (я думал, что сначала пользовательский интерфейс блокируется), а selectedIndexes правильно сохраняет переменные значения. Проблема в том, что иногда я касаюсь ячейки таблицы, и все методы называются правильно, но высота ячейки не изменяется. Кто-нибудь знает, что происходит?

ответ

21

Изменения в поведении в iOS7, где пути указателей иногда являются экземплярами NSIndexPath и другими моментами UIMutableIndexPath. Проблема в том, что isEqual между этими двумя классами всегда будет возвращаться NO. Таким образом, вы не можете надежно использовать указательные пути в качестве словарных клавиш или в других сценариях, которые полагаются на isEqual.

Я могу думать о нескольких жизнеспособных решений:

  1. Написать метод, который всегда возвращает экземпляр NSIndexPath и использовать его для создания ключей:

    - (NSIndexPath *)keyForIndexPath:(NSIndexPath *)indexPath 
    { 
        if ([indexPath class] == [NSIndexPath class]) { 
         return indexPath; 
        } 
        return [NSIndexPath indexPathForRow:indexPath.row inSection:indexPath.section]; 
    } 
    
  2. Идентифицировать строки по данных, а не путь индекса. Например, если ваша модель данных представляет собой массив из NSString, используйте эту строку в качестве ключа в вашей карте selectedIndexes. Если ваша модель данных представляет собой массив NSManagedObjects, используйте objectID и т.д.

Я успешно использую оба этих решения в моем коде.

EDIT Модифицированный раствор (1) на основе @ предложение Роба возвращения NSIndexPaths, а не NSStrings.

+1

ТАК на помощь! – coder

+2

Я применил это решение, сделав «строгий» indexPath и используя его в поиске «forKey». Например.: NSIndexPath * strictIndexPath = [NSIndexPath indexPathForItem: indexPath.row inSection: indexPath.section]; – Rob

+0

@rob Мне это нравится. Обновлен мой ответ с слегка измененным изменением. –

0

endUpdates не следует вызывать сразу после beginUpdates. В документации последнего говорится: «Начните серию вызовов методов, которые вставляют, удаляют или выбирают строки и разделы получателя». Это говорит о том, что его следует называть в willSelectRowAtIndexPath:, а endUpdates следует вызывать в didSelectRowAtIndexPath.

+1

То, что он делает, было хорошо известным трюком для анимации высоты строки ячейки в предыдущих версиях iOS. –

+0

@TimothyMoose, что вы предположены правильно. Знаете ли вы, почему он не работает в iOS7 или вы знаете, как работать? – coder

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