将按钮添加到NavigationBar的titleview,而无需重复代码

时间:2012-04-04 03:25:22

标签: iphone uinavigationbar

为了给出一些背景知识,我正在创建一个基于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属性。

对此的任何帮助都会很棒!谢谢!

1 个答案:

答案 0 :(得分:2)

如果您可以从单个根中继承所有视图控制器,我建议您将上述代码放在UIViewController类别(或UIViewController子类中)。然后在viewDidAppear中,只需调用上面的代码(或将其放在超类的viewDidAppear中)。我认为继承UINavigationBar的子类将比它的价值更麻烦。

如果你真的想避免重新创建按钮(可能没有理由这样做,但如果由于某些原因它对你很重要),你可以将按钮连接到某个单独的对象,而不是将它们指向self 。单例可以直接处理响应,将消息转发给活动视图控制器,也可以发布活动视图控制器可以监听的通知。