我在Storyboard中有一个UITableViewController。我选择了我的UITableViewCell原型,触发了一个segue来呈现另一个控制器。演示文稿本身正在运作。
我注意到一个奇怪的错误(可能在iOS 8中引入),点击单元格按预期突出显示单元格,但有时需要几秒钟才能执行segue。敲击细胞两次会导致segue立即发生。
有没有人在iOS 8中注意到这一点?
编辑:我现在已经注意到,不仅仅是双击更快地触发了segue。它也可以点击单元格,然后在任何地方轻扫。开始对我来说似乎是一个线程问题...
答案 0 :(得分:23)
在我的情况下,解决方案最终是使用GCD从主队列上的performSegue
手动呼叫didSelectRow
,而不是使用故事板中的UITableViewCell
选择插座。
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
dispatch_async(dispatch_get_main_queue(), ^{
[self performSegueWithIdentifier:kShowDetailSegue
sender:nil];
});
}
我不确定为什么这是必要的 - 当然你认为Storyboard中的选择出口会在主队列上运行,但也许它是iOS 8的bug。
答案 1 :(得分:4)
Carlos Vela是正确的,只有在UITableViewCell选择为none并且仅在真实设备上时才会出现错误。选择后唤醒CFRunLoop解决了这个问题,这使我对这个"通用"解决方法(这是UITableViewCell上的一个类别)。
更新:它在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