2014-09-30 68 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

相關問題