如何从非ViewController的辅助类中显示ViewController?

7

通常我们会从某个UIViewController对象中调用self.presentViewController(...),但是在一个不是UIViewController的帮助类中的类类型(静态)函数中如何显示一个新的视图控制器呢。


你的辅助类的根类是什么? - Tirth
@Tirth 没什么,只是一个简单的辅助类。 - Atharva
去助手类.h文件中查看在@interface助手类前面写了哪个类,并告诉我。 - Tirth
@Tirth 我正在使用Swift,没有头文件。 - Atharva
@class HelperClass : NSObject {} 看这个例子,这个简单的HelperClass继承自NSObject。你的代码也是一样的,请检查一下。 - Tirth
显示剩余2条评论
3个回答

5
您可以在助手类中将您的视图控制器作为导航控制器的根视图控制器展示。
UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:@"Main" bundle:[NSBundle mainBundle]];

UINavigationController *controller = (UINavigationController*)[storyBoard
                                                               instantiateViewControllerWithIdentifier: @"RootNavigationController"]; //set storyboard ID to your root navigationController.

YourViewController *vc = [storyBoard instantiateViewControllerWithIdentifier:@"YourViewController"]; // //set storyboard ID to viewController.
[controller setViewControllers:[NSArray arrayWithObject:vc] animated:YES];
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
appDelegate.window.rootViewController=controller;

5

Mayank Jain在Swift 4中的回答:

var storyBoard = UIStoryboard(name: "Main", bundle: Bundle.main)
var controller = storyBoard.instantiateViewController(withIdentifier: "RootNavigationController") as? UINavigationController
//set storyboard ID to your root navigationController.
var vc = storyBoard.instantiateViewController(withIdentifier: "YourViewController") as? YourViewController
// //set storyboard ID to viewController.
controller?.setViewControllers([vc], animated: true)
var appDelegate = UIApplication.shared.delegate as? AppDelegate
appDelegate?.window?.rootViewController = controller

0

直接不可能,您始终需要一个视图控制器/导航控制器实例。但是有一些可行的解决方法。

这取决于需求,您希望如何使用它。以下是一些建议 -

  1. 应用程序委托的导航控制器可以在任何地方访问,您可以使用它。

      YourAppDelegate *delegate = (YourAppDelegate *) [UIApplication sharedApplication].delegate;
    

    现在您可以使用 - delegate.window.rootViewController.navigationController

  2. 在帮助方法实例中传递从中调用它的导航控制器的实例。

    +(void)myHelperMethodWithNavigationController:(UINavigationController*)navController {
      -------
      [navController pushViewController:yourNewCreatedController animated:YES];
     }
    

    在某个视图控制器中调用此方法时 -

    [MyHelperClass myHelperMethodWithNavigationController:self.navigationController];
    

请问您能否补充说明一下,在获取导航控制器实例之后需要做什么? - Atharva
编辑了帖子,它类似于处理视图控制器层次结构的概念,一旦你有导航控制器,你就可以在其上推送视图控制器,以模态方式呈现某些控制器。此外,如果您想访问当前的视图控制器堆栈,也可以访问它。 - rishi
正如pushViewController:animated:的文档所说,如果viewController已经在导航栈中,我们就不能添加它。我们怎么能确定呢?如果已经存在该怎么办?在将某个视图推入导航控制器之前,我们要进行什么样的检查?请参考以下链接:https://developer.apple.com/library/ios/documentation/UIKit/Reference/UINavigationController_Class/index.html#//apple_ref/occ/instm/UINavigationController/pushViewController:animated: - Atharva
navController.viewControllers 给你一个数组,包含了当前导航栈中所有活动的视图控制器。如果已经存在,你可以重用它、移除它并创建新的视图控制器。但是有些情况下,你需要保留同一视图控制器的不同实例,只要你正确地维护导航栈,就不会有问题。 - rishi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接