正确的方式使用UINavigationController的initWithNavigationBarClass:toolbarClass:

从苹果文档我明白,UiNavigationController可以使用initWithNavigationBarClass与另一个Uinavigationbar实例化:toolbarClass:method。 如何通过一个自定义的UiNavigationBar子类和IB正确地做到这一点?

您可以像这样使用它来初始化导航控制器,

UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[CustomNavigationBar class] toolbarClass:nil]; 

这里CustomNavigationBar是通过子类化UINavigationBar创build的自定义类。 您可以使用UINavigationController的setViewControllers属性设置setViewControllers

如果你想在IB做这个,试试这个。 从对象中select导航栏,然后在身份检查器中select导航栏的自定义类。

在这里输入图像说明在这里输入图像说明

在Interface Builder中,单击导航控制器内的导航栏。 在右侧面板上检查它,并将自定义类从UINavigationBar更改为您的自定义子类。

在代码中,确保你已经导入你的导航栏子类的头文件,并写下类似于以下内容。

 // This code assumes `MyCustomNavigationBar` is the name of your custom subclass, and that `viewController` is a UIViewController object created earlier. // To create the containing navigation controller UINavigationController *navigationController = [[UINavigationController alloc] initWithNavigationBarClass:[MyCustomNavigationBar class] toolbarClass:[UIToolbar class]]; // To set the root view controller in the navigation controller navigationController.viewControllers = @[viewController]; 

上面的代码通知UIKit创build一个带有子类MyCustomNavigationBar导航栏的UINavigationController 。 然后,它将根视图控制器设置为存储在variablesviewController的对象。

本杰明·梅奥(Benjamin Mayo)的答案就是为了你的一般小类

 - (UINavigationController *)initWithRootViewController:(UIViewController *)rootViewController navigationBarClass:(Class)navigationBarClass { self = [super initWithNavigationBarClass:navigationBarClass toolbarClass:UIToolbar.class]; if (self) { self.viewControllers = @[rootViewController]; } return self; }