Objective-C 中“无法识别的选择器发送到实例”错误
-
20-09-2019 - |
题
我创建了一个按钮并为其添加了一个操作,但是一旦调用它,我就收到此错误:
-[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(@"---");
}
解决方案
它看起来像您没有存储器正确管理视图控制器,它是在某一时刻被释放 - 这会导致numberButtonClicked:
方法被发送到另一对象,它现在占据该视图控制器先前占用的内存。 ..
请确保你正确地保留/释放您的视图控制器。
其他提示
对于那些到达这里通过谷歌像我一样,这可能涉及更多的Xcode 4.2 + / iOS 5以上再多,又有什么用ARC。我有同样的错误“发送到实例强>的无法识别的选择”。在我来说,我有一个UIButton的目标行动设立传递它本身作为发件人参数,但后来意识到我并不需要它,并移除了代码。所以,这样的:
- (IBAction)buttonPressed:(UIButton *)sender {
改变为:
- (IBAction)buttonPressed {
右点击的UIButton所讨论表明,润色内部事件与buttonPressed视图控制器相关联的:方法。除去这一点,它重新分配给修改后的方法工作一种享受。
这是顶级谷歌回答这个问题,但我有不同的原因/结果 - 我想我会在我的两分钱中添加其他的情况下碰到这个问题绊倒。
我今天早上刚刚有了一个类似的问题。我发现,如果你右击UI项目给你的问题,你可以看到连接已经创造了什么。在我来说,我不得不有线多达两个动作按钮。我删除从右键菜单中的行动和重新布线起来,我的问题是固定的。
因此,请确保您的行为都连接好正确的。
OK,我在这里解囊。的OP的动态创建的按钮即可。我有一个类似的问题和答案(狩猎小时后)是如此简单,它让我恶心。
当使用:
action:@selector(xxxButtonClick:)
or (as in my case)
action:NSSelectorFromString([[NSString alloc] initWithFormat:@"%@BtnTui:", name.lowercaseString])
如果你把冒号在字符串的结束 - 它会通过发送者。如果你不把冒号在字符串也不会结束,如果希望一个接收器将得到一个错误。这是很容易错过,如果你是动态创建的事件名称结肠。
在接收器的代码的选项是这样的:
- (void)doneBtnTui:(id)sender {
NSLog(@"Done Button - with sender");
}
or
- (void)doneBtnTui {
NSLog(@"Done Button - no sender");
}
和往常一样,它始终是被错过了明显的答案。
在我的情况下,函数没想到的参数,但该按钮被配置成发送一个引起错误。为了解决这个问题,我不得不重新连接的事件处理程序。
下面是我的功能:
注意它不包含任何参数。
下面是我的按钮配置的一个图像(右点击按钮来查看它):
注意有3个事件处理程序。
要解决这个问题我不得不因为它们中的一个被发送到自身的引用到enterPressed函数删除每个事件项目。直到没有显示的项目删除这些项目我的小X图标点击每个项目的名称旁边。
接着我不得不重新连接的按钮事件。要做到这一点按住Ctrl键,然后从按钮的动作拖动线。应该说,“连接动作”。注:我不得不重新启动的XCode此为某种原因;否则,只能让我插入的动作(又名创建一个新的动作)的上方或下方的功能。
您现在应该有连接到该传递不带参数的按钮事件的单个事件处理程序:
此答案由致意查利斯@Leonard的答案,你应该读为好。
如果您没有设置“类”,在界面生成器的看法也会发生这种情况。
在我的情况,我是用NSNotificationCenter,并尝试使用不带任何参数的选择,但增加一个冒号。除去结肠固定的问题。
当使用选择名字,不如果没有参数使用一个尾随冒号。如果有一个参数,使用一个结尾冒号。如果有一个以上的参数,就必须沿着他们的名字与每个参数结尾冒号。
请参阅亚当罗森菲尔德的答案在这里:选择器在Objective-C
我有这个问题,在那里我动态创建按钮的雨燕项目。问题代码:
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).")
}
的解决方案是添加完整冒号“:”后动作:e.g
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).")
}
这里 (完整包含)的这一最明显的原因被不适当铸造一个指针和调用错误的类的方法。
NSArray* array = [[NSArray alloc] init];
[(NSDictionary*)array objectForKey: key]; // array is not a dictionary, hence exception
我遇到了类似的问题,但对我来说,解决方案略有不同。就我而言,我使用类别来扩展现有类(UIImage 用于某些调整大小功能 - 请参阅此 如何 如果您感兴趣)并且忘记将 *.m 文件添加到构建目标。愚蠢的错误,但当它发生在哪里时并不总是显而易见的。我认为值得分享...
我有同样的错误,我发现了以下内容:
当您使用的代码
[self.refreshControl addTarget:self action:@selector(yourRefreshMethod:) forControlEvents:UIControlEventValueChanged];
您可能认为这是寻找选择:
- (void)yourRefreshMethod{
(your code here)
}
但它实际上是寻找选择:
- (void)yourRefreshMethod:(id)sender{
(your code here)
}
这是选择不存在,所以你得到的崩溃。
可以在为了解决该错误改变选择器接收(ID)发送者。
但是,如果你有一个调用刷新功能的不的提供发送等功能?你需要一个功能,对于这两种工作。简单的解决方案是添加另一功能:
- (void)yourRefreshMethodWithSender:(id)sender{
[self yourRefreshMethod];
}
和然后修改刷新下拉代码,改为调用该选择器:
[self.refreshControl addTarget:self action:@selector(yourRefreshMethodWithSender:) forControlEvents:UIControlEventValueChanged];
我也做一个旧的Mac OS无法升级到Mac OSX的最新版本的iOS的斯坦福大学课程。所以我还是建设为iOS 6.1,这解决了这个问题对我来说。
我也有同样的问题。
我删除了我的UIButton在我的故事板,并重新创建它..现在一切工作正常。
这发生在我因为不小心删除了“@IBAction FUNC ......”在我的UIViewController类的代码,所以在故事板创建基准出口,但在运行时有任何函数来处理它。
的解决方案是删除属性检查内部的出口参考,然后重新创建它与命令键于类代码的拖动。
希望它能帮助!
我想你应该在返回类型使用空,而不是IBAction为。因为您以编程方式定义的按钮。
另一种可能的解决方案:添加 '-ObjC' 到链接器的参数
。完整的解释是在这里: Objective-C的类别在静态库
我觉得要点是:如果该类别在你使用静态链接库中定义的,该接头是不够聪明的类的方法来连接。上面的标志,使所有目标C类和类别的链接的链接,而不仅仅是那些它的认为的,它需要根据分析源。 (请随时调整或更正答案。我知道该链接的语言,所以我只是人云亦云这里)。
目前,我正在学习iOS开发并通过a按“开始iOS6的发展”一书去。我得到同样的错误在第10章:故事板
我花了两天的时间弄明白,但发现我不小心将电池的TableView的标签设置为1的时候,我不应该。为别人做这本书,并收到了类似的错误,我希望这会有所帮助。
我真的希望在我的代码错误将来更容易找到!哈哈哈。调试错误却丝毫不把我在正确的方向上想出来的(或至少我太新的理解调试器,笑)。
在我的情况下我用一个UIWebView和我在第二个参数,而不是通过NSURL一个的NSString。所以我怀疑是传递给函数错误类类型可能导致此错误。
..现在雷
我必须链接到访问另一个按钮的参数和伟大的工作,但只要我试图做一些与按钮本身的方法的按钮,我崩溃。在编译时,一直显示任何错误。解决方法?
我没有按钮链接到文件的所有者。所以,如果有人在这里是因为我的愚蠢,试试这个:)
又一略微不同的溶液/箱。
我使用Xamarin和MvvmCross和我试图将UIButton的绑定到视图模型。我有UIButton的有线到出口和TouchUpInside。
当结合我只用出口:
set.Bind (somethingOutlet).For ("TouchUpInside").To(vm => vm.Something);
我所要做的就是删除XCode中的动作(TouchUpInside)连接,并且解决它。
P.S。 我想这是在其基础都与以前的答案并@克里斯卡明斯基特别,但我希望这可以帮助别人...
干杯。
我有同样的问题。我的问题是,一个按钮有两个操作方法。我所做的就是创建我的按钮,第一个操作方法,然后在视图控制器删除了它,却忘了断开的连接检查的主要故事板的连接。所以,当我添加了第二个动作方法,有现在2种action方法的一个按钮,从而导致错误。
对我来说,它是在InterfaceBuilder中BIJ CTRL-拖动创建的剩余连接。断开的连接的名字是在错误日志
*** Terminating app due to uncaught exception 'NSInvalidArgumentException',
reason: '-[NameOfYourApp.NameOfYourClass nameOfCorruptConnection:]:
unrecognized selector sent to instance 0x7f97a48bb000'
我不得不连接到一个按钮的操作。按下按钮,坠毁的应用程序,因为出口不再在我的代码存在。 搜索日志中的名引导我给它的故事板。删除了它,和碰撞吸能不见了!
在我的情况下,我的问题解决了在2小时后:
发送者的不具有任何引用插座(一个的TabBar项)即可。因此它被指向不通。
中庸之道创建引用出口强>对应于您的功能。
希望能帮助你们。
我答复伦纳德查利斯,因为我还服用斯坦福的iOS类C193P,因为是用户“oli206”
“终止应用程序由于未捕获的异常 'NSInvalidArgumentException',原因:”
问题是,我有“Enter”按钮上两次连接计算器,和一个朋友指出,这样做的故事板按钮的检查显示,2项分别对“润色Inside”的属性,当我右击的“Enter”键。删除这两个“触摸的内心”,“发送的事件之一”解决了这个问题。
这表明,该问题被触发(在计算器演练C193P视频类上定义1),为2点发送的事件,其中之一是造成异常。
当你没有在指定的ViewController到ViewControllerScene它可以发生 在InterfaceBuilder中。所以ViewController.m未连接到任何场景。
包括我的份额。我被困在这一段时间,直到我意识到我已经创建的 ARC(自动计数参考)禁用。快速设置为YES在该选项解决了我的问题。
此的另一个真傻原因是在界面具有限定所述选择器(.h)中而不是在执行(.M)(P.E.错字)
另一个原因/溶液添加到列表中。这是一个由iOS6.0(和/或坏的编程)引起的。在旧版本的选择将匹配,如果参数类型匹配,但在iOS的6.0我在崩溃之前工作的代码,其中的参数的名称是不正确的。
我正在做类似
[objectName methodName:@"somestring" lat:latValue lng:lngValue];
但在定义(两者h和.M)我有
(viod) methodName:(NSString *) latitude:(double)latitude longitude:(double)longitude;
此精细制作的iOS5但不能在6,即使部署到不同的设备完全相同的构建
我不明白为什么编译器coudn't告诉我这个,反正 - 问题底鞋
。这时候你想从ControllerA属性设置为自定义ControllerB类中的公共财产也可能发生,你有没有设置“自定义类”中的故事板的身份检查里面呢。
我的问题和解决方案是不同的,我想我应该张贴在这里,让未来的读者可以从撞在墙上节省他们的头。
我被分配不同的厦门国际银行,以相同的UIViewController,甚至到处搜寻后,我无法找到如何纠正它。然后我检查了我的AppDelegate,我打电话initWithNibName
,可以看到,在复制的代码,我改变了厦门国际银行的名字,但忘了改UIViewController
类。因此,如果没有一个解决方案适用于您,请检查您initWithNibName
方法。
发生在我由于冲突的约束的参数。