我有一个选项卡式应用程序,其中包含选项卡中的导航控制器和视图控制器。所有这些都使用相同的导航控制器导航栏:后退按钮+徽标图像。目前,我将此代码放在每个视图控制器中:
- (void)viewDidLoad
{
[super viewDidLoad];
self.navigationItem.title = @"Back";
UIImage *headerImage = [UIImage imageNamed:@"Logo.png"];
self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:headerImage] autorelease];
}
恕我直言,这不是最好的方法。我正在考虑使用UIViewController的类别并覆盖viewDidLoad方法,但是每个视图控制器都有一些额外的代码要在viewDidLoad中执行,所以我猜覆盖不是解决方案。还有什么其他方法?
答案 0 :(得分:8)
您可以创建UIViewController
,MyViewControllerWithBackButtonAndLogo
的子类(您可以提供更好的名称),然后实现viewDidLoad
来设置导航项。使所有视图控制器继承自此基类。然后确保视图控制器在他们自己的实现中调用[super viewDidLoad]
。
另请注意,要设置后退按钮标题,您不应更改导航项的title
属性,而应设置适当的backBarButtonItem
。
答案 1 :(得分:0)
在适当的体系结构中,UIViewController(或子类)不应该在意显示在哪个上下文中(例如,在UINavigationController,UITabController,模态内或非模态下)。考虑使用coordinator pattern来执行这种配置,这是协调员的职责。
示例:
class FlowCoordinator {
...
// The coordinator knows about the navigation controller
// Individual view controllers do not.
private let navigationController: UINavigationController
func presentViewController(viewController: UIViewController) {
// This setup can be common for all view controllers in this flow
viewController.navigationItem.titleView = ...
viewController.backBarButtonItem = ...
viewController.navigationItem.title = ...
navigationController.pushViewController(viewController)
}
...
}