按下按钮时无法识别的选择器

时间:2012-07-01 19:16:28

标签: iphone objective-c ios button

我无法相信我在这么简单的事情上磕磕绊绊:

- (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];

4 个答案:

答案 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”方法。