0

我正在开发的应用程序的一部分涉及在用户变为非活动状态时在当前内容上放置一个空白屏幕。因此,在 x 秒后会打开一个空白页面视图控制器:

(从 ViewController.m 中检测到来自 ScreenBlank.m 的 NSNotification 触发)

UIPageViewController *blankPage = [self.storyboard instantiateViewControllerWithIdentifier:@"BlankPageViewController"];
[self presentViewController:blankPage animated:YES completion:nil];

当用户触摸屏幕(并因此确认他们的活动)时,此空白屏幕将被删除,如下所示:

(来自 ViewController.m 的 touchesBegan 回调内部)

[self dismissViewControllerAnimated:YES completion:nil];

我遇到的问题是,我现在想在其他地方触发删除此屏幕空白,例如当用户注销时。这是通过从插入的读卡器中移除一张卡来完成的,这意味着它是从一个单独的类中调用的(并且是从 ActionMgr.m 中实例化的类)。

有问题的类(CardWatcher)是这样创建的:

CardWatcher *newInstance = [[CardWatcher alloc] init];
[newInstance StartCardChecker];

CardWatcher 实例会在卡片被移除时发出通知,如下所示:

[[NSNotificationCenter defaultCenter] postNotificationName:@"logout" object:nil];

然后在 ViewController 中侦听此通知,并在被触发时执行与之前用于空白屏幕的代码完全相同的代码:

[self dismissViewControllerAnimated:YES completion:nil];

通过使用日志记录,我确定通知接收良好,并且正在执行dismissViewControllerAnimated 代码,但由于某种原因,所述代码实际上并没有关闭视图控制器。

我能想到的唯一原因是它(从长远来看)在一个类的实例中被称为表单,但即便如此它也是通过 NSNotification 传递的,所以在我看来它的来源应该是无关紧要的?

任何帮助将非常感激!

4

1 回答 1

4

听起来通知不是在主线程上生成的,因此您试图从辅助线程中关闭页面。确保您在主线程而不是辅助线程上发布通知。当一个通知触发 UI 事件时,比如这个,操作 UI 的代码需要在主线程上执行。

向特定线程发送通知

定期通知中心在发布通知的线程上发送通知。分布式通知中心在主线程上传递通知。有时,您可能需要在由您而不是通知中心确定的特定线程上传递通知。例如,如果在后台线程中运行的对象正在侦听来自用户界面的通知,例如窗口关闭,您希望在后台线程而不是主线程中接收通知。在这些情况下,您必须捕获在默认线程上传递的通知并将它们重定向到适当的线程。

只需尝试以下代码,让我知道它是否适合您。

 dispatch_async(dispatch_get_main_queue(),^{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"logout" object:nil];
 });
于 2013-09-20T08:07:57.493 回答