通过initWithRootViewController以外的方法设置UINavigationController的rootViewController
Posted
技术标签:
【中文标题】通过initWithRootViewController以外的方法设置UINavigationController的rootViewController【英文标题】:Set rootViewController of UINavigationController by method other than initWithRootViewController 【发布时间】:2013-04-19 08:44:41 【问题描述】:如何通过initWithRootViewController
以外的方法设置UINavigationController
的rootViewController
?
我想使用 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
自定义一样覆盖,但它是覆盖 UINavigationController
的 UIToolbar
属性的默认方法。
关于我在遇到的问题上发布的这个后续问题的任何想法。 ***.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的主要内容,如果未能解决你的问题,请参考以下文章
UITabBarController 问题中的 UINavigationController