Подтвердить что ты не робот

Выбор UITableViewCell Слайд-расписание медленнее - двойное нажатие работает, хотя

У меня есть UITableViewController в раскадровке. У меня есть выбор моего прототипа UITableViewCell, запускающего segue для представления другого контроллера. Сама презентация работает.

Я заметил странную ошибку (возможно, представленную в iOS 8), что нажатие на ячейку подсвечивает ячейку, как ожидалось, но иногда занимает несколько секунд, прежде чем выполнить сеанс. Нажатие на ячейку дважды приводит к тому, что segue происходит немедленно.

Кто-нибудь еще заметил это в iOS 8?

EDIT: теперь я заметил, что это не просто двойное нажатие, которое быстрее срабатывает. Это также кран в клетке, за которым следует салфетка. Мне кажется, что это проблема с потоками...

4b9b3361

Ответ 1

В моем случае решение заключалось в том, чтобы вызвать performSegue вручную из didSelectRow в основной очереди с использованием GCD вместо использования выделенной выборки UITableViewCell в раскадровке.

- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
  dispatch_async(dispatch_get_main_queue(), ^{
    [self performSegueWithIdentifier:kShowDetailSegue
                          sender:nil];
  });
}

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

Ответ 2

Карлос Вела прав, ошибка звучит только тогда, когда выбор UITableViewCell отсутствует и только на реальном устройстве. Пробуждение CFRunLoop после выбора решает проблему, и это привело меня к этому "универсальному" обходному пути (который является категорией в UITableViewCell).

UPDATE: он отлично работает под iOS7, но под iOS8 он запускает прозрачный фон UITableViewCell (он будет белым).

#import <objc/runtime.h>

@implementation UITableViewCell (WYDoubleTapFix)

+ (void)load
{
    Method original, swizzled;

    original = class_getInstanceMethod([UITableViewCell class], @selector(setSelected:animated:));
    swizzled = class_getInstanceMethod([UITableViewCell class], @selector(mySetSelected:animated:));
    method_exchangeImplementations(original, swizzled);
}

- (void)mySetSelected:(BOOL)selected animated:(BOOL)animated
{
    [self mySetSelected:selected animated:animated];
    CFRunLoopWakeUp(CFRunLoopGetCurrent());
}

@end