按UIButton会导致无法识别的选择器错误

我的UIView中有一个按钮,它是这样创建的:

 UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(toggleEdit)]; self.navigationItem.rightBarButtonItem = editButton; [editButton release]; 

这是动作方法:

 -(void) toggleEdit:(id)sender { } 

但是我得到了这个错误

2011-09-02 15:27:13.362 blubb [15006:207] – [DatabaseSelectionViewController toggleEdit]:无法识别的选择器发送到实例0x5a29d80 2011-09-02 15:27:13.365 blubb [15006:207] *终止应用程序由于未被捕获exception’NSInvalidArgumentException’,原因:’ – [DatabaseSelectionViewController toggleEdit]:无法识别的选择器发送到实例0x5a29d80′

为什么会这样?

更改

 @selector(toggleEdit) 

 @selector(toggleEdit:) 

选择器的正确名称是

 @selector(toggleEdit:) 

没有它会寻找具有此签名的方法:

 -(void) toggleEdit // No parameters { } 

当你真正宣布:

 -(void) toggleEdit:(id)sender { } 

对于其他任何绊倒这个的人来说,当你不再拥有某些东西并且该语句指向内存中的某个垃圾地址时,你也可以收到那些“无法识别的选择器发送到实例0x …”错误。

应该:

 -(IBAction) toggleEdit:(id)sender {} 

 @selector(toggleEdit:) 

尝试:

 UIBarButtonItem *editButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemEdit target:self action:@selector(toggleEdit) forControlEvents:UIControlEventTouchUpInside]; 

您尝试使用的方法接受一个参数,这意味着它的名称中有一个冒号 – 冒号实际上是名称的一部分 。 获得选择器时需要包含该冒号:

 @selector(toggleEdit:) 

请参阅Objective-C编程语言的消息语法部分:

选择器名称包括名称的所有部分,包括冒号,因此前面示例中的选择器名为setOriginX:y: . 它有两个冒号,因为它需要两个参数。 但是,选择器名称不包含任何其他内容,例如返回类型或参数类型。

如果您正在使用故事板。 有时它有助于从故事板中删除按钮,并添加一个新按钮,并进行必要的连接。