将按钮添加到NavigationBar的titleview而不必重复代码

将按钮添加到NavigationBar的titleview而不必重复代码

问题描述:

为了给出一些背景,我制作了一个基于UINavigationControlled的博客类型应用程序(我认为它最接近iPhone的Facebook应用程序)。无论当前处于活动状态的视图如何,NavigationBar都会在其标题区域显示一些按钮,例如好友请求和活动通知。与facebook应用程序大致相同,单击这些按钮将创建一个弹出视图。将按钮添加到NavigationBar的titleview而不必重复代码

目前,我正在以一种让我觉得效率非常低的方式做事。对于加载的每个视图,我正在重新创建这些按钮并将它们添加到导航栏中。我的代码如下:

//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属性。

任何帮助,这将是伟大的!谢谢!

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

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

+0

谢谢,这样一个简单的解决方案。我知道我错了! – kurisukun 2012-04-05 02:01:47