无法识别的select器发送到实例

我创build一个button和响应点击事件,但得到这个错误:

-[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance 0x3d03ac0 2010-03-16 22:23:58.811 Money[8056:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason:'*** -[NSCFDictionary numberButtonClick:]: unrecognized selector sent to instance 0x3d03ac0' 

这我的代码:

 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { if (self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]) { UIButton *numberButton = [UIButton buttonWithType:UIButtonTypeCustom]; numberButton.frame = CGRectMake(10, 435, 46, 38); [numberButton setImage:[UIImage imageNamed:@"one.png"] forState:UIControlStateNormal]; [numberButton addTarget:self action:@selector(numberButtonClick:) forControlEvents:UIControlEventTouchUpInside]; [self.view addSubview: numberButton]; } return self; } -(IBAction)numberButtonClick:(id)sender{ NSLog(@"---"); } 

它看起来像你不是正确的内存pipe理视图控制器,并在某个时刻被释放 – 这导致numberButtonClicked:方法被发送到另一个对象,现在占用视图控制器先前占用的内存…

确保你正确保留/释放你的视图控制器。

对于那些像我这样通过Google来到这里,可能更多地涉及到Xcode 4.2 + / iOS 5 +更多,什么与ARC。 我有同样的错误“ 无法识别的select器发送到实例 ”。 在我的情况下,我有一个UIButton的目标行动设置为传递自己作为发件人参数,但后来意识到我不需要它,并在代码中删除。 所以,像这样的:

 - (IBAction)buttonPressed:(UIButton *)sender { 

被改为:

 - (IBAction)buttonPressed { 

右键单击问题的UIButton显示Touch Up Inside事件与视图控制器buttonPressed:方法关联。 删除这个并重新分配给修改后的方法是一种享受。

这是Google解决这个问题的最佳答案,但我有一个不同的原因/结果 – 我想我会加两分钱,以防其他人偶然发现这个问题。

今天早上我有类似的问题。 我发现,如果你右键点击UI项目给你的问题,你可以看到什么连接已经创build。 在我的情况下,我有一个button连线两个动作。 我从右键菜单中删除了这些操作,并将它们重新连接起来,我的问题就解决了。

所以要确保你的行为是正确的。

好的,我必须在这里切入。 OP dynamic创buildbutton 。 我有类似的问题,答案(狩猎后几小时)非常简单,使我感到恶心。

使用时:

 action:@selector(xxxButtonClick:) or (as in my case) action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString]) 

如果你在string的末尾放一个冒号 – 它会通过发送者。 如果你不把冒号放在string的末尾,冒号就不会出现,而接收者如果期望冒号的话会得到一个错误。 如果您dynamic创build事件名称,则很容易错过冒号。

接收器代码选项如下所示:

 - (void)doneBtnTui:(id)sender { NSLog(@"Done Button - with sender"); } or - (void)doneBtnTui { NSLog(@"Done Button - no sender"); } 

像往常一样,这是总是明显的答案,错过了。

在我的情况下,该函数并不期待一个参数,但button被configuration为发送一个导致错误。 要解决这个问题,我必须重新连接事件处理程序。

这是我的function:

在这里输入图像描述

注意它不包含参数。

这里是我的buttonconfiguration的图像(右键点击button来查看它):

在这里输入图像描述

注意有3个事件处理程序。

为了解决这个问题,我不得不删除每个事件项,因为其中一个发送一个引用到自己的enterPressed函数。 要删除这些项目,我点击了每个项目名称旁边的小x图标,直到没有显示任何项目。

在这里输入图像描述

接下来,我不得不重新连接到事件的button。 要做到这一点按住Ctrl键,然后从button拖动一行到行动。 应该说“连接操作”。 注:我必须重新启动XCode才能工作,出于某种原因; 否则它只允许我在函数的上面或下面插入动作(又称创build一个新动作)。

在这里输入图像描述

您现在应该有一个单一的事件处理程序连接到不传递任何参数的button事件:

在这里输入图像描述

这个答案恭维@Leonard Challis的答案,你也应该读一下。

在我的情况下,我正在使用NSNotificationCenter,并试图使用不带参数的select器,但添加了冒号。 去除冒号解决了问题。

使用select器名称时,如果没有参数,请不要使用尾部冒号。 如果有一个参数,请使用尾部冒号。 如果有多个参数,则必须将它们与每个参数的尾部冒号一起命名。

请参阅Adam Rosenfield的答案: Objective C中的select器

我有一个Swift项目的问题,我dynamic地创buildbutton。 问题代码:

 var trashBarButtonItem: UIBarButtonItem { return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked") } func newButtonClicked(barButtonItem: UIBarButtonItem) { NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).") } 

解决的办法是在行动之后添加一个冒号“:”

 var trashBarButtonItem: UIBarButtonItem { return UIBarButtonItem(barButtonSystemItem: .Add, target: self, action: "newButtonClicked:") } func newButtonClicked(barButtonItem: UIBarButtonItem) { NSLog("A bar button item on the default toolbar was clicked: \(barButtonItem).") } 

完整的例子在这里: https : //developer.apple.com/library/content/samplecode/UICatalog/Listings/Swift_UIKitCatalog_DefaultToolbarViewController_swift.html

如果您不在界面构build器中设置视图的“类”,也会发生这种情况。

这个(包括完整性)的最明显的原因是不正确地投射指针并且调用错误的类的方法。

 NSArray* array = [[NSArray alloc] init]; [(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception 

我有类似的问题,但对我来说,解决scheme略有不同。 在我的例子中,我使用了一个类来扩展一个现有的类(UIImage的一些resize的function – 见这个如何 ,如果你感兴趣),忘了将* .m文件添加到构build目标。 愚蠢的错误,但并不总是很明显,当它发生在哪里看。 我认为这是值得分享的…

我有同样的错误,我发现了以下内容:

当你使用的代码

 [self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged]; 

你可能会认为它正在寻找select器:

 - (void)yourRefreshMethod{ (your code here) } 

但它实际上是在寻找select器:

 - (void)yourRefreshMethod:(id)sender{ (your code here) } 

该select器不存在,所以你得到的崩溃。

您可以将select器更改为接收(id)发件人以解决错误。

但是如果你有其他的函数调用刷新函数而不提供发送者呢? 你需要一个适用于两者的函数。 简单的解决scheme是添加另一个function:

 - (void)yourRefreshMethodWithSender:(id)sender{ [self yourRefreshMethod]; } 

然后修改刷新下拉代码来调用该select器:

 [self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged]; 

我也在不能升级到Mac OSX最新版本的旧版Mac上执行Stanford iOS课程。 所以我还在为iOS 6.1构build,这解决了我的问题。

我认为你应该使用void,而不是返回types的IBAction。 因为您以编程方式定义了一个button。

在我的情况下,我使用了一个UIWebView,并在第二个参数而不是NSURL中传递了一个NSString。 所以我怀疑错误的类types传递给一个函数可能会导致这个错误。

..现在是我的

我有一个button链接到一个方法,该方法访问另一个button的参数,工作很好,但只要我试图用button本身做什么,我崩溃了。 编译时,没有显示错误。解决方法?

我没有将button链接到文件的所有者。 所以如果这里有人像我一样愚蠢,试试这个:)

我遇到过同样的问题。 对我来说问题是一个button有两个Action方法。 我所做的是为我的button创build第一个操作方法,然后在视图控制器中删除它,但忘记断开连接检查器中主要故事板中的连接。 所以当我添加第二个动作方法时,现在有一个button的两个动作方法,导致了错误。

对我来说,这是一个在interfacebuilder bij ctrl-dragging中创build的剩余连接。 断开连接的名称在错误日志中

 *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]: unrecognized selector sent to instance 0x7f97a48bb000' 

我有一个操作链接到一个button。 按下button会使应用程序崩溃,因为Outlet不再存在于我的代码中。 search日志中的名字,导致我在故事板中。 删除它,崩溃消失了!

我也有同样的问题。

我在故事板中删除了我的uibutton并重新创build了它。现在一切正常。

这发生在我的,因为不小心擦除了我的UIViewcontroller类代码中的“@IBAction func …”,所以故事板中创build了参考出口,但在运行时有任何function来处理它。

解决scheme是删除属性检查器中的Outlet引用,然后使用命令键将其拖到类代码中。

希望它有帮助!

我正在回答Leonard Challis,因为我也是在参加斯坦福大学的iOS课程C193P,就像用户“oli206”

“终止应用程序由于未捕获的exception”NSInvalidArgumentException“,原因:”

问题是我连接了两次计算器上的“Enter”button,一位朋友指出,对Storyboard中的button进行检查显示,当我右键单击时,有2个条目在“Touch Up Inside”属性中“进入”button。 清除其中一个“触摸内部”“发送事件”解决了这个问题。

这表明问题被触发(对于作业1的计算机演练中的C193Pvideo类)为2个发送事件,其中之一导致了该exception。

当您不将ViewController分配给InterfaceBuilder中的ViewControllerScene时,可能会发生这种情况。 所以ViewController.m没有连接到任何场景。

包括我的份额。 我陷入了这一段时间,直到我意识到我已经创build了ARC(自动计数引用)项目被禁用。 该选项快速设置为是解决了我的问题。

另一个非常愚蠢的原因是在接口(.h)中定义了select器,而在实现(.m)(pe typo)

另一个原因/解决scheme添加到列表中。 这一个是由iOS6.0(和/或糟糕的编程)造成的。 在旧版本中,如果参数types匹配,select器将匹配,但是在iOS 6.0中,在先前工作的代码中,参数的名称不正确时,崩溃。

我正在做类似的事情

 [objectName methodName:@"somestring" lat:latValue lng:lngValue]; 

但在定义(包括.h和.m)我有

 (viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude; 

这在iOS5上运行良好,但不是在6上,甚至完全相同的构build部署到不同的设备。

我不明白为什么编译器不会告诉我这个问题,无论如何 – 这个问题已经解决了。

这也可能发生,当你想从ControllerA设置属性到一个自定义的ControllerB类中的公共属性,你还没有设置在自定义检查器中的故事板“自定义类”。

另一个可能的解决scheme:将“-ObjC”添加到链接器参数。

完整的解释在这里: 静态库中的Objective-C类别

我认为要点是:如果在静态链接的库中定义类别,则链接器不够巧妙,无法在类别方法中链接。 上面的标记使链接器链接到所有客观的C类和类别,而不仅仅是它认为需要基于分析源的链接。 (请随意调整或更正答案,我知道链接的语言,所以我只是在这里鹦鹉)。

我目前正在学习iOS开发,并通过aPress阅读“Beginning iOS6 Development”一书。 我在第十章:故事板中遇到了同样的错误。

我花了两天的时间弄清楚了,但是发现我不小心把TableView单元格的标签设置为1。 对于任何人做这本书,并收到类似的错误,我希望这有助于。

我真的希望我的代码中的未来错误更容易find! 哈哈哈。 debugging错误没有任何推动我在正确的方向来弄清楚(或者至less我太新了解debugging器,哈哈)。

我的问题和解决办法是不同的,我想我应该把它放在这里,以便将来的读者可以挽救他们的头撞墙。

我正在分配不同的xib到同一个UIVIewController,甚至在search无处不在,我找不到如何纠正它。 然后我检查了我的AppDelegate在哪里我调用initWithNibName ,可以看到,在复制代码时,我改变了xib名称,但忘了更改UIViewController类。 因此,如果没有解决scheme适用于您,请检查您的initWithNibName方法。

发生在我身上的是因为约束条件的争议。

基础知识:dynamic调用

目标C是一种dynamic语言,它通过查看运行时类中的方法来调用方法。 例如,如果有类A,包括方法DoSomething(arg1,arg2) 。 如果您尝试使用Class A的对象上的正确参数调用该方法,则一切都将正常工作。 但是,如果parameter passing不正确,例如只用一个参数调用方法,那么运行时就会将这个方法视为一个不同方法的方法调用。 最终,运行时将无法find方法(DoSomething有一个参数),并会通过这个exception“无法识别的select器发送到实例”

请检查@selector预期的签名 。 通常情况下,就像你在代码中所描述的那样

 -(IBAction)numberButtonClick:(id)sender{ 

又一个稍有不同的解决scheme/案例。

我正在使用Xamarin和MvvmCross,并试图将UIButton绑定到ViewModel。 我把UIButton连接到一个Outlet和一个TouchUpInside。

当绑定我只使用出口:

 set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something); 

我所要做的只是删除XCode中的动作(TouchUpInside)连接,并解决它。

PS我想这是基于所有有关以前的答案和特别是@Chris Kaminski,但我希望这可以帮助一个人…

干杯。