3

为了提供一些背景知识,我正在制作一个基于 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 属性。

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

4

1 回答 1

2

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

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

于 2012-04-04T14:28:36.977 回答