如何从 NSObject 类获取导航控制器并在 ios 中推送视图控制器
Posted
技术标签:
【中文标题】如何从 NSObject 类获取导航控制器并在 ios 中推送视图控制器【英文标题】:how to get navigation controller from NSObject class and push a view controller in ios 【发布时间】:2016-04-09 07:33:10 【问题描述】:我在一个静态库项目中工作,我想在 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];
但是,如果我以模态方式使用当前视图控制器,它可以工作,但导航控制器隐藏仅加载了视图控制器。 在没有导航控制器的情况下以模态方式呈现的代码如下。
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];
以上代码以模态方式呈现视图控制器,但导航控制器已从视图控制器中移除,但我想使用导航控制器导航到主视图控制器。
【问题讨论】:
我看不出前两个代码sn-ps有什么区别。 拥有一个与使用它的应用程序如此紧密耦合的静态库似乎很奇怪。您通常会使用委托模式或让应用程序向库提供信息 【参考方案1】:尚不完全清楚您要做什么,因此可以说您应该将控制器传递给用于演示或将控制器传回给知道如何演示它的其他人...
无论如何,我猜你的根 VC 是一个导航控制器,所以你应该直接使用它而不是向它询问它的导航控制器(它是 nil)。
UINavigationController *navController = (UINavigationController *)[[[UIApplication sharedApplication] keyWindow] rootViewController];
[navController pushViewController:pushtoVC animated:YES];
【讨论】:
谢谢 Wain,我只是在 navController 中忘记了 (UINavigationController *)。 在 AppDelegate 这给了我一个 NSException 说我的主导航堆栈不存在(无法识别的选择器)。有谁知道那是什么?我认为这会帮助我访问我所在的导航控制器堆栈,不是吗?【参考方案2】:Swift 4 中的相同答案
var navController = UIApplication.shared.keyWindow?.rootViewController as? UINavigationController
navController?.pushViewController(pushtoVC, animated: true)
【讨论】:
【参考方案3】:改进上述答案,因为它是一种幼稚的方法。下面的代码将确保视图控制器上的所有功能都存在。
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)
【讨论】:
以上是关于如何从 NSObject 类获取导航控制器并在 ios 中推送视图控制器的主要内容,如果未能解决你的问题,请参考以下文章
如何从 NSobject 类 iOS 在任何视图控制器类上弹出 MFMessageComposeViewController 对象
在 NSObject 类中设置协议并在 UIViewController 类中调用它们
来自 NSobject 类的 popToRootViewControllerAnimated 给出错误