我有控制器A推动控制器扫描代码。扫描代码时,它使用委托将字符串发送回控制器A.之后,扫描控制器处于极限状态。暂时没问题。
但是在控制器A的委托中,我需要检查结果并使用这些数据。在某些情况下,必须推动另一个控制器B.这不起作用。屏幕停留在扫描控制器上,只闪烁1秒或更短。
根据我的理解,代表在扫描控制器在屏幕上时按下控制器B,然后扫描控制器调用pop。
我的扫描控制器中有这个:
if ([self.delegate respondsToSelector:@selector(QrcodeHasFound:)]) {
[self.delegate QrcodeHasFound:[metadataObj stringValue]];
}
[self.navigationController performSelectorOnMainThread:@selector(popViewControllerAnimated:) withObject:nil waitUntilDone:NO];
这是我的代表:
- (void)QrcodeHasFound:(NSString *)value{
// do some data use
ArticleController *mController = [self.storyboard instantiateViewControllerWithIdentifier:@"articleController"];
[self.navigationController pushViewController:mController animated:YES];
}
我该如何解决这个问题?
答案 0 :(得分:0)
首先,您将要确保在主线程上调用委托方法。现在,看起来好像是从后台线程调用委托方法(基于您在主线程上显式弹出视图控制器的事实)。在您的委托方法中,在后台线程上推送视图控制器可能会导致一些问题。例如:
dispatch_async(dispatch_get_main_queue(), ^(void) {
if ([self.delegate respondsToSelector:@selector(QrcodeHasFound:)]) {
[self.delegate QrcodeHasFound:[metadataObj stringValue]];
}
[[self navigationController] popViewControllerAnimated:YES];
});
可能出现的另一个问题是,您将试图推动视图控制器而另一个突然出现。要解决此问题,我会向pushViewController
方法添加延迟,或者延迟委托方法。