避免由于启动画面或错误的控制器处于活动状态而丢失小部件发送的通知

Posted

技术标签:

【中文标题】避免由于启动画面或错误的控制器处于活动状态而丢失小部件发送的通知【英文标题】:Avoid losing notifications sent by a widget because of a spash screen or wrong controller active 【发布时间】:2016-08-25 11:09:31 【问题描述】:

我有一个小部件,它通过 NSURL 和 extensionContext 调用其对应的应用程序来激活应用程序中的特定操作。

在 AppDelegate 的 application:openURL:options: 方法中我有:

func application(app: UIApplication, openURL url: NSURL, options: [String : AnyObject]) -> Bool 
    if let path = url.path
        if path.containsString("action")
          NSNotificationCenter.defaultCenter().postNotificationName(MyViewController.purchasmyActionKey, object: nil)
        
    
    return true

当应用程序打开并且MyViewController 处于活动状态时,操作会完美执行。但是,如果我在应用程序中的另一个视图控制器上或应用程序已关闭,则不会执行该操作。

有人可以让我走上正确的道路吗?

注意:我的主控制器是UITabBarController,带有各种子视图控制器。一些是UINavigationControllers(包含网格控制器),另一种是ListViewController

【问题讨论】:

【参考方案1】:

最简单的选择是显示您的视图控制器,它将处理此作为选项卡控制器上的模式。这通常是最简单且最简洁的,因为用户在完成此交互后可以轻松返回到他们在此交互之前所做的事情。

如果由于某种原因你不能这样做:

您需要指定某个类负责确保显示正确的视图控制器并告知在看到通知时执行请求。这可能是直接应用程序委托、选项卡栏控制器或您创建并提供对选项卡控制器的引用的其他特定类。

它的工作是检查选项卡控制器的状态并在需要时显示正确的视图控制器,然后告诉该视图控制器开始一些操作。

拥有此逻辑的此类可能是观察您的通知的类,或者您可以直接传递消息,因为您的应用委托可能知道该实例或正在创建一个新实例。

【讨论】:

以上是关于避免由于启动画面或错误的控制器处于活动状态而丢失小部件发送的通知的主要内容,如果未能解决你的问题,请参考以下文章

iOS,如何避免应用长寿?

无法启动协程,因为游戏对象处于非活动状态

切换回搜索栏处于活动状态时,选项卡栏视图变为空白

如何避免在后台运行时启动应用程序时显示启动画面?

在 UIScrollView 仍处于活动状态的情况下检测视图中的连续触摸位置

jQuery Mobile - 仅使可折叠小部件的某些部分处于活动状态