2012-05-11 1 views
2

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

Прямо сейчас, я посылаю deselectRowAtIndexPath к моему столу вида после интервала задержки:

- (IBAction)selectRow 
{ 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:7 inSection:0]; 
    [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop]; 
    [self performSelector:@selector(deselectRow:) withObject:indexPath afterDelay:1.0f]; 
} 

- (void)deselectRow:(NSIndexPath *)indexPath 
{ 
    [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
} 

мне интересно, если есть лучше способ сделать это. Он работает хорошо, но мне не нравится полагаться на статический таймер для выполнения операции, которая иногда может занимать другое время (например, если таблица была очень длинной).

Редактировать: Обратите внимание, что selectRowAtIndexPath:animated:scrollPosition не приведет к запуску методов делегатов UITableView. Ни tableView:didSelectRowAtIndexPath:, ни scrollViewDidEndDecelerating: не будут называться. Из документов:

Вызов этого метода не вызывает делегат получить сообщение tableView:willSelectRowAtIndexPath: или tableView:didSelectRowAtIndexPath:, ни он будет посылать UITableViewSelectionDidChangeNotification уведомления наблюдателей.

ответ

0

UITableViewDelegate является продолжением UIScrollViewDelegate. Вы можете реализовать один из методов UIScrollViewDelegate и использовать это, чтобы определить, когда следует отменить выбор строки. scrollViewDidEndDecelerating: кажется хорошим местом для начала.

Кроме того, я лично считаю, что методы performSelector... ограничивают ограничение 1 параметра. Я предпочитаю использовать GCD. Код будет выглядеть следующим образом:

- (IBAction)selectRow 
{ 
    NSIndexPath *indexPath = [NSIndexPath indexPathForRow:7 inSection:0]; 
    [self.tableView selectRowAtIndexPath:indexPath animated:YES scrollPosition:UITableViewScrollPositionTop]; 
    //deselect the row after a delay 
    double delayInSeconds = 2.0; 
    dispatch_time_t popTime = dispatch_time(DISPATCH_TIME_NOW, delayInSeconds * NSEC_PER_SEC); 
    dispatch_after(popTime, dispatch_get_main_queue(), ^(void){ 
     [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; 
}); 

}

+0

Спасибо за версию НОД. К сожалению, делегат представления прокрутки не будет проинформирован, так как прокрутка не инициируется пользователем. Я выполнил его для проверки, но он был вызван только тогда, когда я прокручивал таблицу вручную. –

+0

Вы можете реализовать 'scrollViewDidScroll:' и проверить 'contentOffset.y', чтобы увидеть, видна ли ячейка. –

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