通过initWithRootViewController以外的方法设置UINavigationController的rootViewController


76

我该如何设定 rootViewControllerUINavigationController通过以外的方法of initWithRootViewController

我想用来initWithNavigationBarClass:toolbarClass:为NavigationController交付自定义工具栏,所以我认为我不能使用initWithRootViewController


我刚刚发现的一种方法是:[navigationController setViewControllers:[NSArray arrayWithObject :(指向应该是根视图控制器的视图控制器的指针)]]]; 这是最好的方法吗?我假设您只应在didFinishLaunching委托方法的AppDelegate文件中调用此方法,因为在此之后,将UINavigationController的视图控制器数组弄乱似乎很危险
drc 2013年

Answers:


144

您可以通过致电解决 setViewControllers

像这样:

UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[MyNavigationBar class] toolbarClass:[UIToolbar class]];

[navigationController setViewControllers:@[yourRootViewController] animated:NO];

迅捷版:

let navigationController = UINavigationController(navigationBarClass: MyNavigationBar.self, toolbarClass: UIToolbar.self)

navigationController.setViewControllers([yourRootViewController], animated: false)

感谢您的确认。这可能需要输入一个单独的问题,但是我认为initWithNav ..意味着我的所有工具栏都具有与在自定义子类中设置的外观相同的外观。然后如何为应用程序的不同部分提供不同样式的工具栏?我可以从该自定义子类返回不同的工具栏吗?还是有更好的方法?
drc

为此,您可以使用,也可以navigationController.navigationBar.tintColor = [UIColor blackColor];-(void)viewDidAppear:animated:ViewControllers的方法中为其设置样式
Leon Lucardie 2013年

因此,这将覆盖以下事实:在我的UIToolBar子类中,我重写了drawRect并设置了自定义背景?这就是我的实现方式:UIImage * backgroundImage = [UIImage imageNamed:@“ UIToolBar_Background.png”]; [backgroundImage drawInRect:CGRectMake(0,0,self.frame.size.width,self.frame.size.height)];
drc

我不确定它是否会覆盖drawRect自定义项,但是它是覆盖UIToolbara属性的默认方法UINavigationController
Leon Lucardie

关于我遇到的问题,我对这个后续问题有任何想法。stackoverflow.com/questions/16215981/…–
drc

27

使用Swift进行知识共享:

从应用程序委托以外的类更改根视图控制器

let appdelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let mainStoryboard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
var homeViewController = mainStoryboard.instantiateViewControllerWithIdentifier("HomeViewController") as! HomeViewController
let nav = UINavigationController(rootViewController: homeViewController)
appdelegate.window!.rootViewController = nav

希望这对某人有帮助。

编辑:

使用Animation更改rootviewcontroller可以通过以下方式实现:

 UIView.transitionWithView(self.window!, duration: 0.5, options: UIViewAnimationOptions.TransitionFlipFromLeft, animations: {
    self.window?.rootViewController = anyViewController
}, completion: nil)

我们可以写与此类似的通用方法


嗨@Arvind,您能告诉我放置此代码的最佳位置吗?是否应将其放在AppDelegate.swift的顶部,以便全局使用变量?还是因为实例化视图而需要将其放在某个类的某个类中?谢谢
FireDragon 2015年

是的,您可以在函数应用程序上使用(应用程序:UIApplication,didFinishLaunchingWithOptions launchOptions:[NSObject:AnyObject]?)-> Bool。除了您可以在任何视图控制器上使用的以外。如您要求注销时所要求的。
2015年

@Arvind如何处理动画?没有显示动画,并且立即显示了rootView。
Engnyl 2015年

@Engnyl:我已经更新了答案。感谢您的查询,这将使其更新。
2015年

在self.navigationController上得到零
Wasim Ahmed

15

这个对我有用,希望对您有帮助,

let rootVC:LoginViewController = self.storyboard?.instantiateViewControllerWithIdentifier("LoginViewController") as! LoginViewController
let nvc:UINavigationController = self.storyboard?.instantiateViewControllerWithIdentifier("RootNavigationController") as! UINavigationController
nvc.viewControllers = [rootVC]
UIApplication.sharedApplication().keyWindow?.rootViewController = nvc

1
你救了我的一天!
—atom2ueki

在self.navigationController上得到零
Wasim Ahmed

@WasimAhmed表示您没有将导航控制器作为根视图控制器
Patel Jigar

3

在Swift 3.0 xcode8.1中

在常规设置中,请在“主界面:主界面<-this”之后删除:

class AppDelegate...

 var window: UIWindow?

    fun application...

      window = UIWindow(frame: UIScreen.main.bounds)
      window?.makeKeyAndVisible()
      window?.rootViewController = UINavigationController(rootViewController: NewYourController)

这不能回答问题。您正在调用initWithRootViewController,正是问题在询问如何避免。
罗宾·多尔蒂

-2
  let storyboard = UIStoryboard(name: "Main", bundle: nil)         
  let yourNewRootView = storyboard.instantiateViewControllerWithIdentifier("yourNewRootView") as? yourNewRootView


   self.window = UIWindow(frame: UIScreen.mainScreen().bounds)

    UIView.transitionWithView(self.window!, duration: 0.1, options: [UIViewAnimationOptions.TransitionFlipFromRight,UIViewAnimationOptions.TransitionFlipFromLeft], animations: 
    {
        // animation

        }, completion: { (finished: Bool) -> () in

            self.window?.rootViewController = nil
            self.window?.rootViewController = yourNewRootView
            self.window?.makeKeyAndVisible()
    })
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.