2013-08-10 5 views
0

У меня есть tableView в моем представлении, и все работает нормально, однако каждая пользовательская ячейка (ToDoListCell) имеет текстовое поле, которое я разрешаю пользователям редактировать, обновляя свои данные. Все хорошо и хорошо, моя проблема возникает при попытке прокрутки к ячейке, которая будет скрыта клавиатурой.Почему мой табличный просмотр не прокручивается до требуемого indexPath?

Примечание: Я корректирую размер таблицы с помощью методов наблюдения NSNotificationCenter, как рекомендует документация Apple, и я знаю, что это не проблема.

- (void)scrollToSelectedCell { 

     NSIndexPath *currentIndexPath = [NSIndexPath indexPathForItem:0 inSection:0]; 
     while (currentIndexPath.row < self.todos.count) { 
      ToDoListCell *cell = (ToDoListCell *)[self.table cellForRowAtIndexPath:currentIndexPath]; 
       if (cell.titleField.isEditing == YES) { 
         [self.table scrollToRowAtIndexPath:currentIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; 
         break; 
       } 

      currentIndexPath = [NSIndexPath indexPathForItem:currentIndexPath.row + 1 inSection:0]; 

     } 
} 

Любая идея, почему она не пролистает ни одну ячейку, которая в настоящее время не отображается на экране?

Спасибо,

Бен

ответ

0

Только предположение, но, вероятно, потому, что

ToDoListCell *cell = (ToDoListCell *)[self.table cellForRowAtIndexPath:currentIndexPath]; 

возвращается nil вызывая cell.titleField.isEditing == YES всегда терпят неудачу. Таким образом, команда прокрутки никогда не вызывается. Представления в таблице отображаются только на видимые ячейки, поэтому, если вы изменили размер табличного представления таким образом, что редактируемая ячейка больше не видна, вы, вероятно, собираетесь получить nil. Перед изменением размера таблицы необходимо определить путь указателя редактируемой ячейки.

0

Если вы увольняете код в ответ на прослушиватель уведомлений, вы увольняете уведомление из потока пользовательского интерфейса?

Анимированные анимации пользовательского интерфейса не будут выполняться, если они выполняются в основном потоке.

dispatch_async(dispatch_get_main_thread(), ^{ 
    // send notification 
});