我想要做的是一个带有图像的导航栏。我的主视图上有一个标签控制器,在每个标签内我都有一个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。
谢谢!
答案 0 :(得分:3)
您描述的重复代码的问题具有优雅的解决方案。 Objective-C支持称为“类别”的东西,它允许您向类添加方法。常见的用途是自定义导航和标签栏。在Xcode 4中,你可以这样做,在UINavigationBar上添加一个类别:
按Command + N或打开“新建文件”对话框。接下来,从Cocoa Touch菜单中选择“Objective-C category”:
单击“下一步”,系统将提示您输入要作为类别添加方法的类的名称。看起来应该是这样的:
然后,您应该最终得到一个保存文件对话框。这里有关于约定的快速说明。惯例是在原始类之后命名一个类别,加号,然后描述您要添加的内容。这是你的看法:
保存文件后,您需要获得以下内容:
看看那美丽。您现在可以覆盖默认的绘图/初始化方法以及扩展导航栏的功能。
我建议您查看init
和drawRect
方法,但我不记得人们使用哪种方法。此外,请注意,虽然在NDA下,这可能会在iOS 5中发生变化,因此请为此做好准备。
答案 1 :(得分:3)
为什么不定义一个UIViewController子类,它通过self.navigationItem.titleView
设置标题视图,让你的其他视图控制器从该类扩展?然后,您将在所有控制器之间共享该行为,而无需重复实施。