【问题标题】:Delegate send value back and push pop view controller委托发送值并推送弹出视图控制器
【发布时间】:2014-11-25 16:55:43
【问题描述】:

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

我应该如何解决这个问题?

【问题讨论】:

    标签: ios objective-c xcode uiviewcontroller delegates


    【解决方案1】:

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

    dispatch_async(dispatch_get_main_queue(), ^(void) {
    
        if ([self.delegate respondsToSelector:@selector(QrcodeHasFound:)]) {
            [self.delegate QrcodeHasFound:[metadataObj stringValue]];
        }
    
        [[self navigationController] popViewControllerAnimated:YES];
    
    });
    

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

    【讨论】:

    • 使用您的代码,屏幕不再闪烁,我可以看到代理调用控制器 B 但直接弹回扫描控制器。如果我将这两行反转为第一个 popViewControllerAnimated 并在之后调用委托,它工作正常。但我不知道在此之后调用代表是否安全。
    • 绝对安全。关于订购的良好观察 - 很高兴解决了您的第二个问题。
    猜你喜欢
    • 1970-01-01
    • 2013-06-04
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2012-07-07
    • 2014-10-03
    • 1970-01-01
    相关资源
    最近更新 更多