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

Posted

技术标签:

【中文标题】通过initWithRootViewController以外的方法设置UINavigationController的rootViewController【英文标题】:Set rootViewController of UINavigationController by method other than initWithRootViewController 【发布时间】:2013-04-19 08:44:41 【问题描述】:

如何通过initWithRootViewController以外的方法设置UINavigationControllerrootViewController

我想使用 initWithNavigationBarClass:toolbarClass: 为我的 NavigationController 提供自定义工具栏,所以我认为我不能使用 initWithRootViewController

【问题讨论】:

我刚刚发现的一种方法是:[navigationController setViewControllers:[NSArray arrayWithObject:(指向应该是根视图控制器的视图控制器的指针)]];这是最好的方法吗?我假设你应该只在 AppDelegate 文件中的 didFinishLaunching 委托方法中调用它,因为在此之后弄乱 UINavigationController 的视图控制器数组似乎有风险 【参考方案1】:

您可以通过拨打setViewControllers来解决这个问题。

像这样:

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

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

Swift 版本:

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

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

【讨论】:

感谢您的确认。这可能需要单独提出一个问题,但我假设 initWithNav.. 意味着我所有的工具栏都将具有我在自定义子类中设置的相同外观。然后,我如何为我的应用程序的不同部分设置不同样式的工具栏?我是否从该自定义子类返回不同的工具栏?还是有更好的方法? 为此,您可以使用 navigationController.navigationBar.tintColor = [UIColor blackColor]; 或者您想在 ViewControllers 的 -(void)viewDidAppear:animated: 方法中设置样式 所以这会覆盖在我的 UIToolBar 子类中我覆盖 drawRect 并设置自定义背景的事实?这就是我实现它的方式: UIImage *backgroundImage = [UIImage imageNamed:@"UIToolBar_Background.png"]; [backgroundImage drawInRect:CGRectMake(0, 0, self.frame.size.width, self.frame.size.height)]; 我不确定它是否会像 drawRect 自定义一样覆盖,但它是覆盖 UINavigationControllerUIToolbar 属性的默认方法。 关于我在遇到的问题上发布的这个后续问题的任何想法。 ***.com/questions/16215981/…【参考方案2】:

使用 Swift 进行知识共享:

从 app delegate.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

希望这对某人有所帮助。

用动画改变rootviewcontroller可以通过以下方式实现:

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

我们也可以写一个泛化的方法,类似于this.

【讨论】:

嗨@Arvind,你能告诉我放置这段代码的最佳位置吗?它应该在 AppDelegate.swift 的顶部,以便变量全局可用吗?或者它可能需要在某个类中,因为它正在实例化视图?谢谢 是的,你可以使用 at func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool.除了你可以在任何视图控制器上。当您要求注销时可能需要。 @Arvind 如何处理动画?不显示动画,立即显示 rootView。 @Engnyl:我已经更新了答案。感谢您的询问,这使它更加更新。 self.navigationController 上为零【参考方案3】:

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

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

【讨论】:

你拯救了我的一天! self.navigationController 上为零 @WasimAhmed 这意味着您没有导航控制器作为根视图控制器【参考方案4】:

在 swift 3.0 xcode8.1 中

在主界面中的常规设置中删除:Main

class AppDelegate...

 var window: UIWindow?

    fun application...

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

【讨论】:

这没有回答问题。您正在调用 initWithRootViewController,这正是问题所要求的如何避免。【参考方案5】:
  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()
    )

【讨论】:

以上是关于通过initWithRootViewController以外的方法设置UINavigationController的rootViewController的主要内容,如果未能解决你的问题,请参考以下文章

无法定位 UITableView?

单元格的三种定制方式

UITabBarController 问题中的 UINavigationController

无法在 UINavigationController 上设置后退按钮

iOS开发-设置导航栏title字体颜色

iOS开发-设置导航栏title字体颜色