UITableViewCell选择故事板segue很慢 - 虽然双击是有效的

时间:2014-10-02 16:55:03

标签: objective-c uitableview storyboard ios8

我在Storyboard中有一个UITableViewController。我选择了我的UITableViewCell原型,触发了一个segue来呈现另一个控制器。演示文稿本身正在运作。

我注意到一个奇怪的错误(可能在iOS 8中引入),点击单元格按预期突出显示单元格,但有时需要几秒钟才能执行segue。敲击细胞两次会导致segue立即发生。

有没有人在iOS 8中注意到这一点?

编辑:我现在已经注意到,不仅仅是双击更快地触发了segue。它也可以点击单元格,然后在任何地方轻扫。开始对我来说似乎是一个线程问题...

2 个答案:

答案 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