当我的申请截止后,我根据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)")
}
以下是当前设置:
答案 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