在栈顶添加一个ViewController
Add a ViewController to the top of the stack
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...
在演示中添加完成处理程序表明这还没有完成。
你试过这个吗..?
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)
所以我终于解决了这个问题.....
根控制器似乎有问题 - 我不确定是什么 - 但这似乎只是拒绝呈现新视图而不会导致应用程序崩溃。
所以首先我需要在 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
}
}
}
}
目前这似乎有效。
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...
在演示中添加完成处理程序表明这还没有完成。
你试过这个吗..?
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)
所以我终于解决了这个问题.....
根控制器似乎有问题 - 我不确定是什么 - 但这似乎只是拒绝呈现新视图而不会导致应用程序崩溃。
所以首先我需要在 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
}
}
}
}
目前这似乎有效。