将ViewController添加到堆栈顶部

时间:2016-11-05 14:24:09

标签: ios swift2 presentviewcontroller

我一直试图让这个工作超过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...

在演示文稿中添加完成处理程序表明这还没有完成。

2 个答案:

答案 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
            }
        }
    }
}

此刻这似乎有效。