无法识别的选择器 NSInvalidArgumentException:对于 IBAction?
Posted
技术标签:
【中文标题】无法识别的选择器 NSInvalidArgumentException:对于 IBAction?【英文标题】:Unrecognized selector NSInvalidArgumentException: for IBAction? 【发布时间】:2013-01-02 14:10:20 【问题描述】:我在 ios iPad 应用程序中遇到了一个奇怪的问题。当我将 UIButton
映射到 IBAction
并使用内部事件进行修饰时,我的应用程序崩溃了。我在控制台中遇到的错误就像
Unrecognized selector NSInvalidArgumentException
.
顺便说一下,我项目中的所有视图控制器都有同样的问题。视图控制器映射到标签栏控制器。
我通过拖放另一个项目的所有文件创建了这个项目。拖动的文件正确放置在当前项目中,没有问题。这会导致问题吗?
我无法弄清楚出了什么问题。
谢谢
【问题讨论】:
复制故事板还是只复制代码? 除了您的方法之外,该按钮在插座中是否有任何其他连接? 实现中的方法和头文件中声明的方法一样吗? 您是通过代码还是从 Nib 连接事件内部的修饰? 今天我在 ios 中创建了一个新项目,将 UIButton 连接到名为“go”的操作,只有 nslog(@"go");但是得到了同样的错误。我试图指出错误,15分钟后我重新创建了新项目,同样的代码......它工作了!!!是时候切换到 AppCode 了,还是在 XCode 中 5 年后我们仍在学习和了解我们的 XCode?span> 【参考方案1】:只需右键单击您在 xib 中的按钮并检查您的按钮是否只有一个连接,如果您有多个连接,请删除不需要的连接。
【讨论】:
我只有一个连接。没问题。【参考方案2】:您是否在界面生成器中设置了自定义UIViewController
子类的类?
【讨论】:
是的,就像你说的那样已经设置好了。例如它就像 MyViewController。【参考方案3】:如果在应用 Gabriele Petronella 和 Rajneesh071 的解决方案后问题仍然存在,那么可能会出现一个小错误:
如果您正在使用:
[btn addTarget:self action:@selector(buttonTouched:) forControlEvents:UIControlEventTouchUpInside];
那么buttonTouched
方法必须是(IBAction)
。
如果 buttonTouched
方法是 (void)
类型,那么只需从您的方法调用中删除该 :
。
我知道这很简单,但它可能会导致崩溃。
【讨论】:
我认为只有 IBAction 类型的方法出现在 IB 中。如果它是一个空白,我不认为它会出现在他的 IB 行动可供选择的方法列表中。 @Jazzmine :是的,我知道。这就是为什么我问 Kanaga 是手动编写代码还是连接了 Outlets。【参考方案4】:我会检查以确保您有 UIButton 引用的无法识别的方法:
1) .h 中列出的方法签名与 .m 文件中列出的方法签名一致吗? 2) 调用方法时是否传递了任何预期的参数? 3) 在您的 .h 和 .m 文件中,该方法是否始终列为类 (+) 或实例 (-) 方法?
我知道您说您复制了文件,但您是否进行了测试以确保您复制的应用程序也可以正常工作?其他应用程序是否将方法连接到按钮?复制后你有没有改变任何东西?
干杯
【讨论】:
【参考方案5】:感谢您的回答。我已经解决了这个问题。
实际问题:
-
我的项目是使用 ARC。
实际上,我通过单击带有IBAction
的按钮将其添加为子视图,从而从一个视图导航到另一个视图,如下所示,
-(IBAction)signInAndGoToFrameworkView :(id)sender
MyViewController myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController " bundle:nil];
[self.view addSubview:myViewController.view];
3 .由于该项目使用 ARC,因此对象 myViewController 被释放,因为这是一个局部变量。所以当我按下后退按钮时
[self.view removeFromSuperview];
应用程序崩溃了。
解决方案:
所以当我刚刚在 .h 文件中声明 MyViewController myViewController
并且还给出了 @property
和 @synthesize
时。然后把IBAction
改成,
-(IBAction)signInAndGoToFrameworkView :(id)sender
myViewController = [[MyViewController alloc] initWithNibName:@"MyViewController " bundle:nil];
[self.view addSubview:myViewController.view];
现在问题解决了。
谢谢。
【讨论】:
以上是关于无法识别的选择器 NSInvalidArgumentException:对于 IBAction?的主要内容,如果未能解决你的问题,请参考以下文章