避免因启动画面或错误的控制器激活而丢失小部件发送的通知

Avoid losing notifications sent by a widget because of a spash screen or wrong controller active

我有一个小部件,它通过 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

最简单的选择是在选项卡控制器上显示将其作为模态处理的视图控制器。这通常是最不复杂和最干净的,因为用户可以在完成后轻松返回到此交互之前他们正在做的事情。

如果您出于某种原因不能这样做:

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

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

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