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

먼저, 주 스레드에서 대리인 메서드를 호출하고 있는지 확인해야합니다. 지금 당장은, 백그라운드 스레드에서 델리게이트 메소드를 호출하는 것처럼 보입니다. (주 스레드에서 뷰 컨트롤러를 명시 적으로 팝업하고 있다는 사실에 기반합니다.) 대리자 메서드에서 백그라운드 스레드에서보기 컨트롤러를 밀면 몇 가지 문제가 발생할 수 있습니다. 예 :

발생할 수있는 다른 문제는 다른 하나가 터지는 동안보기 컨트롤러를 푸시하려고하는 것입니다. 이 문제를 해결하려면 pushViewController 메서드에 지연을 추가하거나 대리자 메서드에 지연을 추가합니다.

+0

코드를 사용하면 더 이상 화면이 깜박 거리지 않고 대리자가 컨트롤러 B를 호출하지만 스캔 컨트롤러로 직접 다시 팝된다는 것을 알 수 있습니다. 만약 내가 처음으로 popViewControllerAnimated 가지고 대리인을 호출하는 두 줄을 반전, 잘 작동하고 있습니다. 그러나 이후에 대의원에게 전화하는 것이 안전한지 여부는 알 수 없습니다. – Kamax

+0

완벽하게 안전합니다. 주문에 대한 좋은 관찰 - 두 번째 문제가 해결되어 기쁘다. –

관련 문제