2012-07-01 185 views
4

无法识别的选择,我不能相信我跌倒在这么简单的东西:按下按钮

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

请问您能否发布确切的错误代码? – Pfitz

+2

你在.h文件中声明了'test'吗? – WendiKidd

+0

你确定你收到“无法识别的选择器发送到实例”,而不是另一个异常? –

回答

10

如果使用ARC,然后demoVC.view将realeasd函数结束时刚过,而不只是初始化这样

DemoViewController *demoVC = [[DemoViewController alloc] init]; 

做一个与它的代码需要在viewDidLoad中或添加的loadView添加任何UI组件时(如果你不`吨添加XIB文件)覆盖方法围绕demoVC强大的性能并对其进行初始化,因为这

self.demoVC = [[DemoViewController alloc] init]; 
-2

你可以要求你的代码的某个地方的NSString “测试” 的方法。

+0

...什么?你能否进一步解释你的答案? – WendiKidd

3

您的错误消息指示(最有可能)您的视图控制器正在按下按钮之前释放。 (它显示消息正在发送到一个NSString,它可能占用了视图控制器曾经使用的内存。)

最简单的方法是使用zombies来确认这一点,并确定为什么您的对象正在被尽早释放。

编辑:根据您的演示代码,例如,您应该创建一个实例变量来保存对视图控制器的引用。您可能还想将按钮初始化代码移至viewDidLoad以避免将来出现其他问题。 (或者只是挂钩的按钮,笔尖!)

-1

,你也需要添加参数发件人(这是recommandation)

前) - (空)测试:(ID)发送

,并添加目标这样的.... [按钮addTarget :self action:@selector(test :) forControlEvents:UIControlEventTouchUpInside]