覆盖UINavigationBar以设置默认titleView

时间:2011-08-03 23:46:13

标签: iphone objective-c ios4 uinavigationbar

我想要做的是一个带有图像的导航栏。我的主视图上有一个标签控制器,在每个标签内我都有一个UINavigationController。从我的tab / navigationController调用的UIViewController内部,我可以设置titleView没有太大问题,在viewDidLoad方法中执行此操作:

self.navigationItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mylogo.png"]] autorelease];

但是,我想在我的navigationBar中替换此视图中的所有标题,并且在任何地方重复此操作似乎都很难看。所以我在委托上做了这个(在连接所有出口的东西之后)

self.tabOneNavController.navigationBar.topItem.titleView = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"mylogo.png"]] autorelease];

再一次,它有效!好的,我快到了那里。 但重点是,我有5个选项卡,所有这些选项卡里面都有navigationControllers。我将代码重复从每个内部视图减少到只有5次,但它仍然存在。它要求我为每个选项卡的NavController执行此操作。

然后我尝试扩展UINavigationBar来创建我自己的,我可以在初始化器中设置它,并在接口构建器中将它用作对象类。但它似乎没有用。这是我做的:

@implementation MyNavigationBar

- (id)init {
    self = [super self];

    self.tintColor = [UIColor greenColor];
    self.topItem.title = @"testing please work";

    return self;
}

@end
接口文件中的

MyNavigationBar继承自UINavigationBar。但这没效果。我应该覆盖其他方法吗?哪一个?这是一个好习惯吗? 我甚至不确定是否应该为每个标签添加一个navigationBar,正如我所说,我有标签,我想要一个导航栏/在其中导航。到目前为止,经过近乎死亡的经验,试图弄清楚界面构建器/出口和类是如何工作的,代码正在运行,我只是想对它进行unglify。

谢谢!

2 个答案:

答案 0 :(得分:3)

您描述的重复代码的问题具有优雅的解决方案。 Objective-C支持称为“类别”的东西,它允许您向类添加方法。常见的用途是自定义导航和标签栏。在Xcode 4中,你可以这样做,在UINavigationBar上添加一个类别:

按Command + N或打开“新建文件”对话框。接下来,从Cocoa Touch菜单中选择“Objective-C category”:

Creating a category

单击“下一步”,系统将提示您输入要作为类别添加方法的类的名称。看起来应该是这样的:

Making a Category on the NavBar

然后,您应该最终得到一个保存文件对话框。这里有关于约定的快速说明。惯例是在原始类之后命名一个类别,加号,然后描述您要添加的内容。这是你的看法:

Category Naming Convention

保存文件后,您需要获得以下内容:

Empty Category

看看那美丽。您现在可以覆盖默认的绘图/初始化方法以及扩展导航栏的功能。

我建议您查看initdrawRect方法,但我不记得人们使用哪种方法。此外,请注意,虽然在NDA下,这可能会在iOS 5中发生变化,因此请为此做好准备。

答案 1 :(得分:3)

为什么不定义一个UIViewController子类,它通过self.navigationItem.titleView设置标题视图,让你的其他视图控制器从该类扩展?然后,您将在所有控制器之间共享该行为,而无需重复实施。