2014-09-30 64 views
0

我有控制器A推动控制器扫描代码。扫描代码时,它使用代理将字符串发送回控制器A.稍后,扫描控制器将被调用。目前没有问题。代表发送回值并推送弹出视图控制器

但是在控制器A的委托中,我需要检查结果并使用这些数据。在某些情况下,必须按下另一个控制器B.这不起作用。屏幕停留在扫描控制器上,它只闪烁1秒或更少。

据我所知,委托人在扫描控制器在屏幕上时按下控制器B,此后扫描控制器调用弹出。

我有这个在我的扫描控制器:

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

首先,您要确保您在主线程上调用委托方法。现在,看起来好像您是从后台线程调用委托方法(基于您明确地在主线程上弹出视图控制器的事实)。在您的委托方法中,在后台线程上推视图控制器可能会导致一些问题。例如:

dispatch_async(dispatch_get_main_queue(), ^(void) { 

    if ([self.delegate respondsToSelector:@selector(QrcodeHasFound:)]) { 
     [self.delegate QrcodeHasFound:[metadataObj stringValue]]; 
    } 

    [[self navigationController] popViewControllerAnimated:YES]; 

}); 

另一个可能出现的问题是,您将尝试在另一个弹出窗口时推送视图控制器。为了解决这个问题,我会给pushViewController方法添加一个延迟,或者延迟委托方法。

+0

随着你的代码,屏幕不再闪烁,我可以看到代表呼叫控制器B,但直接回到扫描控制器。如果我倒过来两行有第一popViewControllerAnimated并调用委托后,它工作正常。但是我不知道在这之后是否可以调用委托。 – Kamax 2014-09-30 23:03:10

+0

这将是完全安全的。关于订购的好的观察 - 很高兴能解决你的第二个问题。 – 2014-09-30 23:32:24

相关问题