Выбор UITableViewCell Слайд-расписание медленнее - двойное нажатие работает, хотя
У меня есть UITableViewController в раскадровке. У меня есть выбор моего прототипа UITableViewCell, запускающего segue для представления другого контроллера. Сама презентация работает.
Я заметил странную ошибку (возможно, представленную в iOS 8), что нажатие на ячейку подсвечивает ячейку, как ожидалось, но иногда занимает несколько секунд, прежде чем выполнить сеанс. Нажатие на ячейку дважды приводит к тому, что segue происходит немедленно.
Кто-нибудь еще заметил это в iOS 8?
EDIT: теперь я заметил, что это не просто двойное нажатие, которое быстрее срабатывает. Это также кран в клетке, за которым следует салфетка. Мне кажется, что это проблема с потоками...
Ответы
Ответ 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