无法识别的选择器发送到实例

Posted

技术标签:

【中文标题】无法识别的选择器发送到实例【英文标题】:Unrecognized selector sent to instance 【发布时间】:2011-02-26 16:53:23 【问题描述】:

有人知道我为什么会收到这个错误吗?

Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[CustomRaisedTabViewController cancel:]: unrecognized selector sent to instance 0x4d321e0'

这是失败的代码。这是我的CustomTabViewController。当我单击“取消”按钮时发生错误。

-(IBAction)showPostModalViewController 

PostActionModalViewController *addController = [[PostActionModalViewController alloc] 
                                                initWithNibName:@"PostActionModalView" bundle:nil];

// Configure the PostAddViewController. In this case, it reports any
// changes to a custom delegate object.

addController.delegate = self;



// Create the navigation controller and present it modally.

UINavigationController *navigationController = [[UINavigationController alloc]
                                                initWithRootViewController:addController];

[self presentModalViewController:navigationController animated:YES];

UIBarButtonItem *cancelButton =
[[UIBarButtonItem alloc] initWithTitle: @"Cancel"
                                 style: UIBarButtonItemStylePlain
                                target: self
                                action: @selector(cancel:)];
addController.navigationItem.rightBarButtonItem = cancelButton;
[cancelButton release];


//[self presentModalViewController:addController animated:true];
[navigationController release];

[addController release];


-(IBAction)cancel 
    [self.parentViewController dismissModalViewControllerAnimated:YES];

【问题讨论】:

你试图调用一个有参数的选择器,而你的实际方法没有参数。只需在您的@selector 中删除cancel: 之后的冒号,它应该可以正常工作。或者,您可以修改您的 cancel 操作,如下所述。 How can I debug 'unrecognized selector sent to instance' error的可能重复 【参考方案1】:

因为cancel: 方法不是您定义的cancel

将您的 cancel 操作更改为如下所示:

- (IBAction)cancel:(id)sender 
    ...

【讨论】:

我是菜鸟...当我取消...它会知道关闭/销毁 addController 和 navigationController 不保证它会立即发生。但是假设您遵循内存管理规则,那么在某个时候,当系统认为合适时,肯定会。 @selector 指令中删除多余的冒号不是更简单吗? OP 的 cancel 方法无论如何都会忽略该参数,那么为什么要通过它呢? 按照惯例,动作会接受发送者的参数,如果你开始违反惯例,很容易开始出错,因为有时你使用发送者,有时你不使用。随着时间的推移和开发人员之间的使用一致性消除了很多潜在的错误。【参考方案2】:
action: @selector(cancel:) 

对于带参数的动作选择器! cancel:这意味着 which 将采用另一个参数。

改变你的方法

-(IBAction)cancel:(id)sender
// Do wat you want


or

-(IBAction)cancel:(UIButton *)btnSender
/// Do what you want

【讨论】:

【参考方案3】:

你必须修改中的取消方法签名

-(IBAction)cancel:(id)sender
  
   [self.parentViewController dismissModalViewControllerAnimated:YES]; 
 

当您将操作添加到您的取消按钮(在初始化期间)时,您指定了“取消:”选择器,这意味着它将被称为具有一个参数的方法(发送者按钮)

【讨论】:

以上是关于无法识别的选择器发送到实例的主要内容,如果未能解决你的问题,请参考以下文章

快速代码崩溃:“发送到实例的无法识别的选择器”

Swift 3:将无法识别的选择器发送到手势识别器实例

无法识别的选择器发送到实例,UISlider swfit3

UITableViewController 无法识别的选择器发送到实例

无法识别的选择器发送到实例

[UICollectionViewCell imageView]:无法识别的选择器发送到实例