我无法相信我在这么简单的事情上磕磕绊绊:
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
[button setTitle:@"Tap me" forState:UIControlStateNormal];
[button addTarget:self action:@selector(test) forControlEvents:UIControlEventTouchUpInside];
button.frame = CGRectMake(50, 50, 120, 60);
[self.view addSubview:button];
}
return self;
}
-(void)test {
NSLog(@"Test");
}
按下按钮时发生崩溃,出现unrecognized selector sent to instance
错误。
有人知道我在这里做错了吗?
编辑 - 错误讯息:
-[__NSCFString test]: unrecognized selector sent to instance 0x29ee30
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSCFString test]: unrecognized selector sent to instance 0x29ee30'
编辑 - 它是如何呈现的(ARC):
DemoViewController *demoVC = [[DemoViewController alloc] init];
[self.window addSubview:demoVC.view];
[self.window makeKeyAndVisible];
答案 0 :(得分:10)
如果你正在使用ARC,那么demoVC.view将在函数结束后重新分配,而不是像这样初始化
DemoViewController *demoVC = [[DemoViewController alloc] init];
围绕demoVC创建一个强大的属性并将其初始化为
self.demoVC = [[DemoViewController alloc] init];
答案 1 :(得分:3)
您的错误消息表明(很可能)在按下按钮之前您的视图控制器已被释放。 (它显示消息正在发送到NSString,这可能占用视图控制器曾经占用的内存。)
最简单的方法是使用zombies来确认这一点并确定您的对象提前解除分配的原因。
编辑:根据您的演示代码,您应该制作一个实例变量来保持对视图控制器的引用。您可能还希望将按钮初始化代码移动到viewDidLoad
以避免将来出现其他问题。 (或者只是用笔尖挂上按钮!)
答案 2 :(得分:-1)
添加任何带有代码的UI组件时,需要在viewDidLoad或loadView中添加(如果你不添加xib文件)覆盖方法。
并且您还需要为发件人添加参数(这是推荐)
ex) - (void)test:(id)sender
并添加这样的目标.... [button addTarget:self action:@selector(test :) forControlEvents:UIControlEventTouchUpInside]
答案 3 :(得分:-2)
您可以在代码中的某处调用NSString的“test”方法。