我正在使用ios应用程序,我目前正在尝试向导航栏添加自定义按钮。
UIBarButtonItem *optButton = [[UIBarButtonItem alloc]
initWithTitle:@"Option1"
style:UIBarButtonItemStyleBordered
target:self
action:@selector(Option:)];
UINavigationItem *item = [[UINavigationItem alloc] initWithTitle:title];
item.leftBarButtonItem = optButton;
[navBar pushNavigationItem:item animated:YES];
[optButton release];
[item release];
-(void)Option:(id)sender{
NSLog(@"****Look at me!*****");
}
现在,这样可以显示左侧导航栏上的按钮,但是当我点击按钮时没有任何反应。它根本不会对触摸做出反应。如何获取自定义按钮以响应用户输入?导航栏是在代码中创建的,我根本不使用导航控制器或IB。我有使用
设置的navbars委托[ navBar setDelegate: self ];
在拥有它的视图控制器中。任何帮助将不胜感激
编辑:这就是我在viewdidload
中创建导航栏的方法navBar = [ [ UINavigationBar alloc ] initWithFrame: CGRectMake(0, 0, 320, 45.0f)];
[ navBar setDelegate: self ];
[navBar pushNavigationItem:[ [ UINavigationItem alloc ] initWithTitle:@"MoM" ] animated:YES];
[ self.view addSubview: navBar ];
不使用导航控制器的原因是我希望能够更改导航栏的属性,并且根据导航控制器上的苹果参考,我不应该直接修改导航控制器导航栏的框架。如果我误解了这一点,请说出来。我在这个视图控制器中不需要导航控制器,因为它将始终在应用程序中显示。我有单独的导航控制器,分别处理其他视图控制器的转换,但这个特定的视图控制器是一个独立的实体,无论在其他地方发生什么,它总是在屏幕顶部可用
讨论
允许修改barStyle或半透明属性 导航栏但您必须永远不要更改其框架,边界或 alpha值直接。要显示或隐藏导航栏,您应该 总是通过改变它的导航控制器这样做 navigationBarHidden属性或调用 setNavigationBarHidden:animated:method。
EDIT2:
经过一些研究之后,我发现人们已经让他们的应用程序被拒绝搞乱导航控制器中的导航栏框架属性,所以我不会尝试这个。我在苹果网站上看到他们确实允许一个独立的导航栏,我可以搞乱它的属性并让视图控制器接受uinavbar委托。使视图控制器必须直接通过导航栏处理所有输入。这看起来是我想要的方法如果您使用导航栏作为独立对象,则应该 将自定义委托对象分配给委托属性并使用它 对象拦截来自导航栏的消息。代表 对象必须符合UINavigationBarDelegate协议。该 通过委托通知,您可以跟踪何时推送导航项 或从堆栈弹出。您可以使用这些通知进行更新 应用程序的其余用户界面。
答案 0 :(得分:2)
设置当前视图控制器的navigationItem
的{{1}}属性,而不是创建一个并推送..
leftBarButtonItem
答案 1 :(得分:0)
我正在做类似的事情,只有我这样做:
- (void) viewDidLoad
{
...
self.navigationItem.title = @"My Title";
self.navigationItem.rightBarButtonItem =
[[UIBarButtonItem alloc] initWithTitle:@"Save"
style:UIBarButtonItemStyleDone
target:self
action:@selector(save)];
...
}
- (void) save
{
// Do stuff
}
答案 2 :(得分:0)
我没有看到optButton
被添加到导航项的任何位置。我看到的是这一行:
item.leftBarButtonItem = backButton;
也许您需要将backButton
更改为optButton
? (除非它不仅仅是问题中的拼写错误)。