如何在传递通知后加载ViewController

时间:2014-11-28 09:38:55

标签: ios core-data swift uilocalnotification

当我的申请截止后,我根据UILocalNotification设置了Core-Data,并在NSManagedObject媒体资源中保存了userInfo的链接。这很好。

然后当UILocalNotification触发并且用户滑动它时,应用程序会加载,我使用NSNotificationCenter成功将userInfo传递给我的MainViewController。这很好。

在此,我使用managedObjectIDForURIRepresentation查找Core-Data对象并运行performSegue以显示DetailViewController。这可以很好地 IF 用户在MainViewController

时关闭了应用程序

然而,我的问题取决于用户退出时用户在应用程序中的位置。

例如,他们在查看SettingsViewController时退出,然后当他们访问UILocalNotification时,它会将DetailViewController放在SettingsViewController的顶部。他们看到正确的对象很好,但是我希望后退按钮将它们带回MainViewController

如果它们位于UIViewController深入DetailViewController 3或4层并退出,则同样如此。当他们访问UILocalNotification时,会将DetaiViewController放在他们所在的位置。同样,我更希望应用程序折叠之前的DetailViewController并重新开始。

希望这是有道理的。不知道除了尝试设置大量的"放松"如果访问UILocalNotification则触发的segues。是否有更简单,更好的方法?

更新

以下是didReceiveLocalNotification

中的内容
func application(application: UIApplication, didReceiveLocalNotification notification: UILocalNotification) {
    var state:UIApplicationState = application.applicationState
    if state == UIApplicationState.Inactive {
        println("app del notification : \(notification.userInfo)")
        NSNotificationCenter.defaultCenter().postNotificationName(kShowNotification, object: notification.userInfo)
    }
}

更新

好的,我喜欢弹出连接到UINavigationController的2 UISplitViewController s(Master& Detail),但不知道如何实际执行此操作。

我已设置我的子类UISplitViewController以收到NSNotificationCenter消息。但是这个计数总是1:

// MARK: Notifications
func showEventNotication(notification: NSNotification) {
    println("split view controllers: \(self.viewControllers.count)")
}

以下是当前设置:

enter image description here

3 个答案:

答案 0 :(得分:1)

它对我有用(Swift 2.0)。 我有TabBarController和NavigationController + ViewControllers。 当应用程序收到localNotification并点击按钮后,它将显示MyViewController。 在AppDelegate中:

func application(application: UIApplication, handleActionWithIdentifier identifier: String?, forLocalNotification notification: UILocalNotification, completionHandler: () -> Void) {

    if identifier == "showDetails" {

        let tabBarController = window?.rootViewController as! UITabBarController
        tabBarController.selectedIndex = 0

        let myViewController = window?.rootViewController!.storyboard?.instantiateViewControllerWithIdentifier("MyViewController") as? MyViewController

        let controller = tabBarController.selectedViewController as! UINavigationController
        controller.pushViewController(myViewController!, animated: false)
    }

    completionHandler()
}

答案 1 :(得分:0)

如果您在AppDelegate中引用了UINavigationController,则可以使用- (void)application:(UIApplication *)application didReceiveLocalNotification:(UILocalNotification *)notification方法更改导航堆栈。

如果您引用了UINavigationController,只需致电[navController popToRootViewControllerAnimated:NO]即可让它弹出堆叠,然后推送MainViewController然后按DetailViewController就像现在一样

答案 2 :(得分:0)

我之前没有这样做过。我有个建议。

通知完成时,在当前导航层次结构中注入视图控制器并不好或不合适。如果您知道git存储库为每个克隆/签出维护单独的brach,那么您可以做一些事情。

所以你需要这样做。您处于某个中间状态并显示通知,然后保留当前的导航流并从该点开始新的分支。

所以在最后挖掘了这个与通知相关的流程之后,你有了节点/联结以安全地恢复你以前的应用程序流程(就像你说的那样,在收到通知之前,它会引导你到之前的视图控制器。)

我认为这样做的一种方式是来自当前视图控制器的presentViewController。我没试过,但它会起作用。

didReceiveLocalNotification方法中获取当前视图控制器,并在此处显示链接到通知的视图控制器。

画报流程:

NavigationController ----> VC1 ---->  SettingsViewController
                                      /                  |
                                     /                   |
                                    /                    |
                                   /                     |   
                             Back /_______________   Notification received
                                 |                           |
                                 |                           | present view controller
                            Back |                           |   
                                 |                           V
                                 |                  NotificationViewController
                                 |                           |
                                 |                           V
                              Storage <----------------- Operations