我正在处理的应用程序的一部分涉及在用户变为非活动状态时在当前内容上放置一个空白屏幕。因此,在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中侦听此通知,并在被触发时,执行与用于清空screenearlier的相同代码:
[self dismissViewControllerAnimated:YES completion:nil];
通过使用日志记录,我已经确定通知正在接收,并且正在执行dismissViewControllerAnimated代码,但由于某种原因,所述代码实际上并没有解除视图控制器。
我能想到的唯一原因是,在一个类的实例中它是(从长远来看)被调用的形式,但即便如此它也是通过NSNotification传递的,所以在我看来它的来源应该是无关紧要的?
非常感谢任何帮助!
答案 0 :(得分:4)
听起来好像主线程上没有生成通知,因此您试图从辅助线程中删除该页面。确保您在主线程上发布通知,而不是从辅助线程发布。当通知触发UI事件(例如此事件)时,需要在主线程上执行操作UI的代码。
Delivering Notifications To Particular Threads
常规通知中心在线程中发送通知 通知已发布。分布式通知中心 在主线程上发送通知。有时,您可能需要 要在特定线程上传递的通知 由您而不是通知中心确定。例如,如果 在后台线程中运行的对象正在侦听 来自用户界面的通知,例如窗口关闭,您 想在后台线程中收到通知 而不是主线程。在这些情况下,你必须抓住 通知,因为它们是在默认线程和重定向上传递的 他们到适当的线程。
只需尝试以下代码,并告诉我它是否适合您。
dispatch_async(dispatch_get_main_queue(),^{
[[NSNotificationCenter defaultCenter] postNotificationName:@"logout" object:nil];
});