2012-07-01 183 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]