以编程方式创建和显示 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 的正确方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章