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

Posted

技术标签:

【中文标题】以编程方式创建和显示 UIBarButtonItem 的正确方法是啥?【英文标题】:What's the correct way to create and show an UIBarButtonItem programmatically?以编程方式创建和显示 UIBarButtonItem 的正确方法是什么? 【发布时间】:2012-08-23 13:12:32 【问题描述】:

我遇到了一个问题:每次点击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 模拟器中运行代码。

【问题讨论】:

没什么。问题将出在其他地方。效果很好,我试过了! 您是否尝试启用 ARC? 是的,我用 ARC 试过了,我完全复制了你的代码。如果我按下按钮,日志每次都是“ciao”。 这是我得到的:-[__NSCFString showSettings]:无法识别的选择器发送到实例 0x6b63280。我敢打赌我在做一些非常愚蠢的事情,这类错误是最难发现的。 这意味着,您的 ViewConroller 没有 showSettings 方法。你确定这个方法是由创建 UIBarButtonItem 的 ViewController 完全实现的吗? 【参考方案1】:

变化:

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

- (void) showSettings:(UIBarButtonItem *)sender


【讨论】:

这似乎并没有解决问题,应用总是崩溃。 你是不是在选择器设置的方法名末尾加了“:”? 你不必是你要调用的方法不要带任何参数。【参考方案2】:

正如ref 文档中提到的关于选择器的:

如果一个对象接收到一条消息来执行一个不在其范围内的方法 曲目,一个错误的结果。这与调用 a 的错误类型相同 不存在的功能。但由于消息传递发生在运行时, 在程序执行之前,错误通常并不明显。

因此,请确保您的方法在视图控制器的范围内。我将首先检查您是否有任何错字。如果您的方法不带任何参数,请不要使用:,并确保您已在类描述中声明了您的方法。

【讨论】:

【参考方案3】:

以编程方式创建 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

希望对你有帮助

【讨论】:

以上是关于以编程方式创建和显示 UIBarButtonItem 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

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

以编程方式创建页面控件不显示

以编程方式创建的视图不显示

UIImageView(以编程方式创建)未显示

允许在以模式方式显示的以编程方式创建的视图内自动旋转

以编程方式创建的 rootviewcontroller 未显示分配的 viewcontroller 的内容