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

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

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

【问题讨论】:

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

标签: ios uinavigationcontroller uitoolbar iphone-5


【解决方案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 属性的默认方法。
  • 关于我在遇到的问题上发布的这个后续问题的任何想法。 stackoverflow.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()
    })

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-13
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多