委托发回值并推送弹出视图控制器

时间:2014-09-30 22:46:09

标签: ios objective-c xcode uiviewcontroller delegates

我有控制器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];
}

我该如何解决这个问题?

1 个答案:

答案 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方法添加延迟,或者延迟委托方法。