我一直试图让这个工作超过1个月,不用说,它变得荒谬了。如果我的方法错误或者我有一个导致问题的独特设置,我无法解决问题。我在以下过程中尝试了几十种变体,但没有成功。
我在AppDelegate中有一个进程,该进程调用委托控制器中的一个函数,该函数获取用户的数据以准备显示其配置文件。
func application(application: UIApplication, didReceiveRemoteNotification userInfo: [NSObject : AnyObject], fetchCompletionHandler completionHandler: (UIBackgroundFetchResult) -> Void) {
notificationsDelegate.userId = thisid
notificationsDelegate.getUser()
}
在notificationsDelegate中,数据检索的成功代码触发,因此没有问题。然后,代码应该将用户配置文件视图添加到堆栈顶部,以便在应用程序重新打开时显示,但它永远不会显示。正在使用的代码是
var root = UIApplication.sharedApplication().delegate!.window!?.rootViewController as! UINavigationController
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let pvc = storyboard.instantiateViewControllerWithIdentifier("UserProfile") as! UserProfile
pvc.modalPresentationStyle = UIModalPresentationStyle.FullScreen
pvc.user = user
root.visibleViewController!.presentViewController(pvc, animated: true, completion: nil)
我在这个过程中有一个提示,所以我知道它会运行,但应用程序只会在关闭时重新打开,而不会在顶部添加用户控制器。
此过程看起来是否正确?
是的,我已经尝试了root.presentViewController....
root.pushViewController....
root.topViewController.presentViewController....
root.topViewController.presentedViewController.presentViewController...
在演示文稿中添加完成处理程序表明这还没有完成。
答案 0 :(得分:0)
你试过这个吗??
let root = UIApplication.sharedApplication().delegate! as! AppDelegate
let storyboard = UIStoryboard(name: "Main", bundle: nil)
let pvc = storyboard.instantiateViewControllerWithIdentifier("UserProfile") as! UserProfile
pvc.modalPresentationStyle = UIModalPresentationStyle.FullScreen
root.window?.rootViewController?.presentViewController(pvc, animated: true , completion: nil)
答案 1 :(得分:0)
所以我终于解决了这个问题.....
根控制器似乎存在一些问题 - 我不确定是什么 - 但这似乎只是在不崩溃应用程序的情况下拒绝新视图的显示。
首先,我需要在AppDelegate中找到实际的顶级控制器并将其传递给notificationsDelegate。
我将以下内容添加到notificationsDelegate。
var topview: AnyObject?
我在didReceiveRemoteNotification中添加了以下内容。
notificationsDelegate.topview = self.topViewController()
然后使用以下内容找到顶级控制器。
func topViewController() -> UIViewController? {
if UIApplication.sharedApplication().keyWindow != nil {
return self.topViewControllerWithRootViewController(UIApplication.sharedApplication().keyWindow!.rootViewController!)
}
return nil
}
func topViewControllerWithRootViewController(rootViewController: UIViewController?) -> UIViewController? {
if rootViewController == nil {
return nil
}
if rootViewController!.isKindOfClass(UITabBarController) {
let tabBarController: UITabBarController = (rootViewController as? UITabBarController)!
return self.topViewControllerWithRootViewController(tabBarController.selectedViewController)
}
else {
if rootViewController!.isKindOfClass(UINavigationController) {
let navigationController: UINavigationController = (rootViewController as? UINavigationController)!
return self.topViewControllerWithRootViewController(navigationController.visibleViewController)
}
else {
if (rootViewController!.presentedViewController != nil) {
let presentedViewController: UIViewController = rootViewController!.presentedViewController!
return self.topViewControllerWithRootViewController(presentedViewController)
}
else {
return rootViewController
}
}
}
}
此刻这似乎有效。