Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c UITableViewCell选择情节串连板序列很慢-但双击可以工作_Objective C_Uitableview_Storyboard_Ios8 - Fatal编程技术网

Objective c UITableViewCell选择情节串连板序列很慢-但双击可以工作

Objective c UITableViewCell选择情节串连板序列很慢-但双击可以工作,objective-c,uitableview,storyboard,ios8,Objective C,Uitableview,Storyboard,Ios8,我在故事板中有一个UITableViewController。我选择了我的UITableViewCell原型,触发一个序列来呈现另一个控制器。演示本身正在工作 我注意到一个奇怪的错误(可能是在iOS 8中引入的),点击单元格会按预期高亮显示单元格,但有时在执行segue之前需要几秒钟。轻敲电池两次会导致该过程立即发生 在iOS 8中有没有其他人注意到这一点 编辑:我现在注意到,不仅仅是双击可以更快地触发segue。这也是一个轻触细胞,然后轻扫任何地方。对我来说,开始似乎是一个线程问题…在我的情况

我在故事板中有一个UITableViewController。我选择了我的UITableViewCell原型,触发一个序列来呈现另一个控制器。演示本身正在工作

我注意到一个奇怪的错误(可能是在iOS 8中引入的),点击单元格会按预期高亮显示单元格,但有时在执行segue之前需要几秒钟。轻敲电池两次会导致该过程立即发生

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


编辑:我现在注意到,不仅仅是双击可以更快地触发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