Objective c UITableViewCell选择情节串连板序列很慢-但双击可以工作
我在故事板中有一个UITableViewController。我选择了我的UITableViewCell原型,触发一个序列来呈现另一个控制器。演示本身正在工作 我注意到一个奇怪的错误(可能是在iOS 8中引入的),点击单元格会按预期高亮显示单元格,但有时在执行segue之前需要几秒钟。轻敲电池两次会导致该过程立即发生 在iOS 8中有没有其他人注意到这一点Objective c UITableViewCell选择情节串连板序列很慢-但双击可以工作,objective-c,uitableview,storyboard,ios8,Objective C,Uitableview,Storyboard,Ios8,我在故事板中有一个UITableViewController。我选择了我的UITableViewCell原型,触发一个序列来呈现另一个控制器。演示本身正在工作 我注意到一个奇怪的错误(可能是在iOS 8中引入的),点击单元格会按预期高亮显示单元格,但有时在执行segue之前需要几秒钟。轻敲电池两次会导致该过程立即发生 在iOS 8中有没有其他人注意到这一点 编辑:我现在注意到,不仅仅是双击可以更快地触发segue。这也是一个轻触细胞,然后轻扫任何地方。对我来说,开始似乎是一个线程问题…在我的情况
编辑:我现在注意到,不仅仅是双击可以更快地触发segue。这也是一个轻触细胞,然后轻扫任何地方。对我来说,开始似乎是一个线程问题…在我的情况下,解决方案是使用GCD从主队列上的
didSelectRow
手动调用performSegue
,而不是使用故事板中的UITableViewCell
选择出口
- (void) tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
dispatch_async(dispatch_get_main_queue(), ^{
[self performSegueWithIdentifier:kShowDetailSegue
sender:nil];
});
}
我不知道为什么有必要这样做——当然,你会认为故事板中的选择出口会在主队列上运行,但可能是一个iOS 8错误。是正确的,该错误仅在UITableViewCell选择为无且仅在真实设备上出现时才会出现。选择后唤醒CFRunLoop解决了这个问题,这让我找到了这个“通用”解决方法(UITableViewCell上的一个类别)
更新:它在iOS7下工作得很好,但在iOS8下它破坏了透明的UITableViewCell背景(它将是白色的)
#导入
@实现UITableViewCell(WYDoubleTapFix)
+(空)荷载
{
方法原发性,Swizzle;
original=class_getInstanceMethod([UITableViewCell class],@selector(setSelected:animated:);
swizzled=class_getInstanceMethod([UITableViewCell class],@selector(mySetSelected:animated:);
方法交换实施文件(原件,SWIZED);
}
-(void)mySetSelected:(BOOL)selected animated:(BOOL)animated
{
[self-mySetSelected:selected animated:animated];
CFRunLoopGetCurrent());
}
@结束
没有任何代码,只是在情节提要中继续?如果在didSelectRow
上添加performSegue
,会发生什么情况?我讨厌使用segues,我添加它们的唯一原因是为了标记应用程序的流程。是的,我会发布代码,但基本上没有。试过你说的,同样的问题。你一定在做什么。我用旧项目进行了测试,也创建了一个新项目,但选择和推送之间没有延迟,就像在iOS8之前一样。我也有同样的问题,我不明白为什么会发生这种情况。我尝试了不同的音阶和performSegue,但都没有解决问题。只有将“表视图”单元格选择设置为“无”时才会发生这种情况,否则效果很好。我发布了最终解决方案。感谢@LordZsolt再次尝试的灵感。如果您希望此segue的行为与原始segue相同。不要使用sender:nil
而使用sender:[tableView cellforrowatinexpath:indexPath]
。这意味着在prepare for segue中,您可以使用发送方来确定indexPath,这在设置目标视图控制器时是经常需要的。我遇到了一个类似的问题,在实际加载下一个视图之前,以编程方式调用PerformsgueWithIdentifier需要10秒以上的时间。我不确定幕后到底发生了什么样的线程废话,但在主队列上进行调度也解决了我的问题。值得一提的是,我充分利用了多个EER连接(实际上并没有太多其他功能);不确定这是否相关。不幸的是,苹果还没有修复这个错误!在iOS 9中仍然会发生!iOS 10.3,bug仍然存在。空白项目,只有带基本单元格的UITableViewController和要转换的VC。将cells属性“selection”设置为none,有时会导致不调用segue的问题(通常在滚动表格之后)。始终调用didSelectRow。Segue直接从cell连接到另一个VC。只要将DispatchQueue.main.async{}(传递空块)放在didSelectRow中,就可以解决这个问题。
#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