以编程方式创建和显示UIBarButtonItem的正确方法是什么?

时间:2012-08-23 13:12:32

标签: ios uinavigationcontroller automatic-ref-counting uibarbuttonitem

我遇到了问题:每次点击UIBarButtonItem时我正在处理的应用都会崩溃。

我正在我的主ViewController的viewDidLoad方法中创建按钮:

UIBarButtonItem *settingsButton = [[UIBarButtonItem alloc] initWithTitle:@"Settings" style:UIBarButtonItemStyleBordered target:self action:@selector(showSettings)];
self.navigationItem.leftBarButtonItem = settingsButton;

showSettings方法只包含NSLog():

- (void)showSettings {
    NSLog(@"ciao");
}

按钮在导航栏中正确显示,但无论何时点击,应用程序都会发出exc_bad_access消息。

我做错了什么?

编辑:ARC已启用,我正在iOS 5.1模拟器中运行代码。

3 个答案:

答案 0 :(得分:1)

的变化:

UIBarButtonItem *settingsButton = [[UIBarButtonItem alloc] initWithTitle:@"Settings" style:UIBarButtonItemStyleBordered target:self action:@selector(showSettings:)]; 

- (void) showSettings:(UIBarButtonItem *)sender
{
}

答案 1 :(得分:0)

正如关于选择器的ref doc所述:

  

如果对象收到消息以执行不在其中的方法   保留曲目,错误结果。这与调用a一样是一种错误   不存在的功能。但是因为消息发生在运行时,所以   在程序执行之前,错误通常不明显。

因此,请确保您的方法在viewcontroller的范围内。我将首先检查你没有任何拼写错误。如果您的方法不采用任何参数,请不要使用:并确保您已在类描述中声明了您的方法。

答案 2 :(得分:0)

以编程方式创建uibarbutton。此示例适用于自定义uibarbutton

UIButton *timebutton = [[UIButton alloc]initWithFrame:CGRectMake(0, 0, 90, 40) ];
[timebutton setTitle:timeString forState:UIControlStateNormal];
[timebutton setTitleColor:[UIColor blackColor] forState:UIControlStateNormal];


UIBarButtonItem *rightBarButtonItem1 = [[UIBarButtonItem alloc]  
                                      initWithCustomView:timebutton];
[rightBarButtonItem1 setTintColor:[UIColor blackColor]];

//set the action for button
rightBarButtonItem1.action =  @selector(navigationMethod:);


self.navigationItem.rightBarButtonItem = rightBarButtonItem1;


//Method declaration
-(IBAction)navigationMethod:(id)sender{
 // action
}

希望这有助于你