为了给出一些背景知识,我正在创建一个基于UINavigationControlled的博客类型应用程序(我认为它最像iPhone Facebook应用程序)。无论当前处于活动状态的视图如何,NavigationBar都会在其标题区域中显示一些按钮,例如“朋友请求”和“活动通知”。与facebook应用程序大致相同,单击这些按钮将创建一个弹出视图。
目前,我的工作方式让我觉得非常低效。对于每个加载的视图,我正在重新创建按钮并将它们添加到导航栏。我的代码如下:
//Setup the custom middle buttons
UIView *container = [[UIView alloc] init];
container.frame = CGRectMake(0, 0, 80, 44);
// create a button and add it to the container
UIButton *notificationButton = [UIButton buttonWithType:UIButtonTypeCustom];
notificationButton.frame = CGRectMake(0, 0, 35, 44);
[notificationButton addTarget:self
action:@selector(showNotifications:)
forControlEvents:UIControlEventTouchUpInside];
[container addSubview:notificationButton];
// add another button to the container
UIButton *friendActivityButton = [UIButton buttonWithType:UIButtonTypeCustom];
friendActivityButton.frame = CGRectMake(45, 0, 35, 44);
[friendActivityButton addTarget:self
action:@selector(showFriendActivity:)
forControlEvents:UIControlEventTouchUpInside];
[container addSubview:friendActivityButton];
// Set the titleView to the container view
[self.navigationItem setTitleView:container];
[container release];
由于我的应用程序有多个视图且导航栏始终可见,因此继续重新创建按钮,将它们添加到容器视图,然后将该视图添加到导航控制器的titleView中似乎很愚蠢。
实现同样效果的更好方法是什么?我正在研究子类化或为UINavigationBar创建一个类别,并可能在那里添加容器视图代码。但是,我不知道如何让选择器在这些情况下工作。我也不确定如何使用UINavigationBar类别访问titleView属性。
对此的任何帮助都会很棒!谢谢!
答案 0 :(得分:2)
如果您可以从单个根中继承所有视图控制器,我建议您将上述代码放在UIViewController
类别(或UIViewController
子类中)。然后在viewDidAppear
中,只需调用上面的代码(或将其放在超类的viewDidAppear
中)。我认为继承UINavigationBar
的子类将比它的价值更麻烦。
如果你真的想避免重新创建按钮(可能没有理由这样做,但如果由于某些原因它对你很重要),你可以将按钮连接到某个单独的对象,而不是将它们指向self
。单例可以直接处理响应,将消息转发给活动视图控制器,也可以发布活动视图控制器可以监听的通知。