我使用UITableView来呈现各种viewControllers.根据单击的索引,它将显示一个不同的视图控制器,然后可以将其解除.出于某种原因,我的一个ViewControllers需要两次点击才能显示.因此,似乎每个其他点击都有效.其他视图演示工作正常,所以表可能没问题.
我在ViewController中看到的即将显示的是,在第一次单击时,它通过didSelectRowAtIndexPath进行,然后在目标视图中触发:ViewWillLoad,ViewLoaded,ViewWillAppear ....但不是ViewDidAppear.在第二次单击时,只有ViewDidAppear会在显示时触发.在第二次单击时,它甚至没有通过didSelectRowAtIndexPath.此外,我可以第二次点击屏幕上的任意位置,它将显示.
它将继续来回执行此操作,似乎只显示每隔一次点击的目标视图.有没有想过为什么会这样?
/* RightPanelViewController */ - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { switch(indexPath.row){ case 0: // this view takes two clicks to display [self presentViewController:self.delegateRef.savedRidesViewController animated:YES completion:nil]; break; case 1: // this works fine, as do others [self presentViewController:self.delegateRef.sensorsViewController animated:YES completion:nil]; break; case 2: ... } /* savedRidesViewController */ - (void) viewWillAppear:(BOOL)animated { [super viewWillAppear:animated]; } - (void)viewDidAppear:(BOOL)animated{ [super viewDidAppear:animated]; }
AXE.. 56
看看这个:https://devforums.apple.com/thread/201431
如果你不想全部阅读 - 一些人(包括我)的解决方案是presentViewController
在主线程上显式调用:
dispatch_async(dispatch_get_main_queue(), ^{ [self presentViewController:myVC animated:YES completion:nil]; });
可能iOS7正在弄乱线程didSelectRowAtIndexPath
.
经过更多的调试,我能够确定它不是视图控制器,而是与didSelectRowAtIndexPath和presentViewController有关.它开始发生在我所呈现的其他观点上,而且不可靠.我也试过使用if/else代替switch而没有帮助.
最终我发现这个解决方案能够解决它,但我不完全确定原因.通过无延迟地使用performSelector,所有视图立即加载(可能比没有它时更快?)并且每次都可靠地加载.
它并不像代码一样干净,但它现在可靠地工作.我仍然很好奇为什么需要这样做.
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { switch(indexPath.row){ case 0: [self performSelector:@selector(load0:) withObject:nil afterDelay:0]; break; case 1: [self performSelector:@selector(load1:) withObject:nil afterDelay:0]; break; case 2: [self performSelector:@selector(load2:) withObject:nil afterDelay:0]; break; ... } } -(void)load0:(id)sender { [self presentViewController:self.delegateRef.zonesViewController animated:YES completion:nil]; } -(void)load1:(id)sender { [self presentViewController:self.delegateRef.sensorsViewController animated:YES completion:nil]; } -(void)load2:(id)sender { [self presentViewController:self.delegateRef.savedRidesViewController animated:YES completion:nil]; }
看看这个:https://devforums.apple.com/thread/201431
如果你不想全部阅读 - 一些人(包括我)的解决方案是presentViewController
在主线程上显式调用:
dispatch_async(dispatch_get_main_queue(), ^{ [self presentViewController:myVC animated:YES completion:nil]; });
可能iOS7正在弄乱线程didSelectRowAtIndexPath
.
这是中的实际错误presentViewController:animated:completion:
。在此处查看我的答案以及适当的解决方法:https : //stackoverflow.com/a/30787046/1812788