无法识别的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,但我希望这可以帮助一个人…
干杯。