如何为所有导航控制器和视图控制器设置自定义导航栏(标题+ titleView)?

时间:2011-10-21 07:51:10

标签: iphone objective-c uinavigationcontroller uinavigationitem

我有一个选项卡式应用程序,其中包含选项卡中的导航控制器和视图控制器。所有这些都使用相同的导航控制器导航栏:后退按钮+徽标图像。目前,我将此代码放在每个视图控制器中:

- (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中执行,所以我猜覆盖不是解决方案。还有什么其他方法?

2 个答案:

答案 0 :(得分:8)

您可以创建UIViewControllerMyViewControllerWithBackButtonAndLogo的子类(您可以提供更好的名称),然后实现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)
    }

    ...
}