在栈顶添加一个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
            }
        }
    }
}

目前这似乎有效。