如何从NSObject类获取导航控制器并在ios中推送视图控制器

如何从NSObject类获取导航控制器并在ios中推送视图控制器,ios,objective-c,uinavigationcontroller,Ios,Objective C,Uinavigationcontroller,我在一个静态库项目中工作,我想在iOS项目的导航控制器中推送一个视图控制器。我该怎么做?我的做法如下: UIStoryboard * storyboard = [[[UIApplication sharedApplication] keyWindow] rootViewController].storyboard; UIViewController* pushtoVC = [storyboard instantiateViewControllerWithIdentifier:@"home"]

我在一个静态库项目中工作,我想在iOS项目的导航控制器中推送一个视图控制器。我该怎么做?我的做法如下:

  UIStoryboard * storyboard = [[[UIApplication sharedApplication] keyWindow] rootViewController].storyboard;
UIViewController* pushtoVC = [storyboard instantiateViewControllerWithIdentifier:@"home"];
UINavigationController *navController = [[[[UIApplication sharedApplication] keyWindow]rootViewController] navigationController];
[navController pushViewController:pushtoVC animated:YES];
我也尝试了下面的代码,但它没有推送视图控制器

  UIStoryboard * storyboard = [[[UIApplication sharedApplication] keyWindow] rootViewController].storyboard;
UIViewController* pushtoVC = [storyboard instantiateViewControllerWithIdentifier:@"home"];
UINavigationController *navController = [[[[UIApplication sharedApplication] keyWindow]rootViewController] navigationController];
[navController pushViewController:pushtoVC animated:YES];
但,若我使用当前视图控制器,它会正常工作,但导航控制器会隐藏仅加载的视图控制器。 在没有导航控制器的情况下,MODALY的代码如下所示

 UIStoryboard * storyboard = [[[UIApplication sharedApplication] keyWindow] rootViewController].storyboard;
            if ([[storyboard valueForKey:@"identifierToNibNameMap"] objectForKey:@"home"]) {
                // the view controller exists, instantiate it here
                UIViewController* myVC = [storyboard instantiateViewControllerWithIdentifier:@"home"];
                myVC.modalPresentationStyle = UIModalPresentationFullScreen;
                [[[[UIApplication sharedApplication]keyWindow] rootViewController] presentViewController:myVC animated:YES completion:nil];

上面的代码是以模式显示视图控制器,但导航控制器已从视图控制器中删除,但我想使用导航控制器导航到主视图控制器。

不完全清楚您到底想做什么,所以可以说,您应该传递一个用于表示的控制器,或者将控制器传递回知道如何表示它的其他人

  UIStoryboard * storyboard = [[[UIApplication sharedApplication] keyWindow] rootViewController].storyboard;
UIViewController* pushtoVC = [storyboard instantiateViewControllerWithIdentifier:@"home"];
UINavigationController *navController = [[[[UIApplication sharedApplication] keyWindow]rootViewController] navigationController];
[navController pushViewController:pushtoVC animated:YES];
无论如何,我猜你的根VC是一个导航控制器,所以你应该直接使用它,而不是要求它的导航控制器为零

UINavigationController *navController = (UINavigationController *)[[[UIApplication sharedApplication] keyWindow] rootViewController];
[navController pushViewController:pushtoVC animated:YES];
同样的答案在Swift 4中

var navController = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController
navController?.pushViewController(pushtoVC, animated: true)

由于这是一种幼稚的方法,因此对上述答案进行即兴修改。下面的代码将确保视图控制器上的所有功能都存在

let storyBoard : UIStoryboard = UIStoryboard(name:"Main", bundle: nil)
        if  let conVC = storyBoard.instantiateViewController(withIdentifier: "StoryboardID") as? ViewController,
            let navController = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController{
            navController.pushViewController(conVC, animated: true)

我看不出前两段代码有什么不同。静态库与使用它的应用程序紧密耦合似乎很奇怪。您通常会使用委派模式,或者让应用程序将信息提供给图书馆。谢谢,它正在工作。我刚刚忘记了navController中的UINavigationController*。在AppDelegate中,这给了我一个N异常,表示我的主导航堆栈不存在。有人知道这是怎么回事吗?我想这会帮助我访问我所在的导航控制器堆栈,不是吗?