最近今天在编写一个学习系统ios版本,遇到了unrecognized selector sent to instance 0x7fe0f314de10 类似这样的错误。
我这个程序的大体意思是一个viewcontroller A中需要包含另外一个viewcontroller B或者自定义的viewB,这样可以在A中定义一个B属性。定义之后按常理,在a中获得b属性,直接赋值就可以了,但是却会抛出上面的错误。经过查找资料和亲自测试,发现只要把定义在.m文件中的局部成员变量b,剪切到.h文件中变成全局变量就可以了。这个错误不仅出现在我的这个例子中,在其他btn响应事件啊,等等都会出现此问题,大家不妨试一下把成员变量的位置,从.m文件复制到.h文件中。
为方便大家理解,特找到类似的代码,方便大家理解上面的意思。
**//application delegate 中代码**
- (void)applicationDidFinishLaunching:(UIApplication *)application
{
WTView *WTView = [[WTView alloc]initWithNibName:@"WTView" bundle:nil];
[self.window addSubview:[WTView view]];
[window makeKeyAndVisible];
}
//自定义的WTView controller 中代码如下
//@interface 中声明
- (IBAction)Click:(id)sender;
//@implementation 中实现
- (IBAction) Click:(id)sender
{
NSLog(@”Click Test”);
}
nib文件中也是正确连接相应的事件。
以上代码正常运行是没有问题,可是当你点击Click 按钮的时候确出现了如下错误:
-[NSCFType buttonClicked:]: unrecognized selector sent to instance 0x44e1e0
这时候对于初学者来说莫名其妙,反复检查都是没有问题,但是就是会crash。
解决方法如下:
问题的原因就是声明MainView controller的时候出现问题。把MainView声明成立局部变量,导致MainView中的action不能正确识别本身的ViewController
改正很简单:
MainView 定义在Application的.h文件中就可以了。
#import <UIKit/UIKit.h>
#import "WTView.h"
@interface TestAppDelegate : NSObject <UIApplicationDelegate>
{
UIWindow *window;
WTView *WTView; //在此定义
}
@property (nonatomic, retain) IBOutlet UIWindow *window;
@end
此处只是拿简单的例子举例,在其他例子中,也有可能出现类似问题,大家不妨试一下。如果还有其他方式的,可以发表评论,大家互相学习。