2010-06-15 55 views
5

我尝试了很多东西,仍然没有结果。UIButton addTarget:action:forControlEvents:results in [NSObject doesNotRecognizeSelector:]

所以我在UIViewController中的一个子类编程创建了以下按钮:

rightButton = [UIButton buttonWithType:UIButtonTypeCustom]; 
    rightButton.frame = CGRectMake(0.0, 0.0, 110.0, 40.0); 
    rightButton.titleLabel.font = [UIFont fontWithName:GAME_FONT_NAME_STRING size:20.0]; 
    [rightButton setTitle:@"MyTitle" forState:UIControlStateNormal]; 
    rightButton.backgroundColor = [UIColor clearColor]; 
    [rightButton setTitleColor:[UIColor greenColor] forState:UIControlStateNormal]; 
    [rightButton setTitleColor:[UIColor blackColor] forState:UIControlStateHighlighted]; 
    [rightButton setBackgroundImage:normalImage forState:UIControlStateNormal]; 
    [rightButton setBackgroundImage:highlightedImage forState:UIControlStateHighlighted]; 
    [rightButton addTarget:self action:@selector(myButton) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:rightButton]; 

其中,选择是:

- (void)myButton; 

我什么都试过:

- (void)myButton; 
- (void)myButton:(id)sender; 
- (void)myButton:(id)sender forEvent:(UIEvent *)event; 
- (IBAction)myButton; 
- (IBAction)myButton:(id)sender; 
- (IBAction)myButton:(id)sender forEvent:(UIEvent *)event; 

和当然相应的选择器:

[rightButton addTarget:self action:@selector(myButton) forControlEvents:UIControlEventTouchUpInside]; 
[rightButton addTarget:self action:@selector(myButton:) forControlEvents:UIControlEventTouchUpInside]; 
[rightButton addTarget:self action:@selector(myButton:forEvent:) forControlEvents:UIControlEventTouchUpInside]; 
[rightButton addTarget:self action:@selector(myButton) forControlEvents:UIControlEventTouchUpInside]; 
[rightButton addTarget:self action:@selector(myButton:) forControlEvents:UIControlEventTouchUpInside]; 
[rightButton addTarget:self action:@selector(myButton:forEvent:) forControlEvents:UIControlEventTouchUpInside]; 

结果始终是未捕获的异常 - [NSObject doesNotRecognizeSelector:]。然而,该计划通常的回溯是:

#0 0x92a6bedb in objc_msgSend() 
#1 0x03b0a430 in ??() 
#2 0x00306b4e in -[UIControl sendAction:to:forEvent:]() 
#3 0x00308d6f in -[UIControl(Internal) _sendActionsForEvents:withEvent:]() 
#4 0x00307abb in -[UIControl touchesEnded:withEvent:]() 
#5 0x002bcddf in -[UIWindow _sendTouchesForEvent:]() 
#6 0x002a67c8 in -[UIApplication sendEvent:]() 
#7 0x002ad061 in _UIApplicationHandleEvent() 
#8 0x02498d59 in PurpleEventCallback() 
#9 0x01cabb80 in CFRunLoopRunSpecific() 
#10 0x01caac48 in CFRunLoopRunInMode() 
#11 0x02497615 in GSEventRunModal() 
#12 0x024976da in GSEventRun() 
#13 0x002adfaf in UIApplicationMain() 

那么这个按钮有什么问题?

PS:我使用的是iPhone SDK 3.1.3


更新!

在AppDelegate中下面的代码(在界面上没有声明):

- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    UIButton *test = [[UIButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 100.0)]; 
    [test setTitle:@"Title" forState:UIControlStateNormal]; 
    UIImage *bg = [UIImage imageNamed:...]; 
    [test setBackgroundImage:bg forState:UIControlStateNormal]; 
    [test addTarget:self action:@selector(testAction) forControlEvents:UIControlEventTouchUpInside]; 
    [window addSubview:test]; 
    [test release]; 
    [window makeKeyAndVisible]; 
} 

- (void)testAction { 
    NSLog(@"Write something..."); 
} 

作品完美!

但是,如果我创建一个具有相同的代码一个空的UIViewController:

- (void)viewDidLoad { 
    UIButton *test = [[UIButton alloc] initWithFrame:CGRectMake(0.0, 0.0, 320.0, 100.0)]; 
    [test setTitle:@"Title" forState:UIControlStateNormal]; 
    UIImage *bg = [UIImage imageNamed:...]; 
    [test setBackgroundImage:bg forState:UIControlStateNormal]; 
    [test addTarget:self action:@selector(testAction) forControlEvents:UIControlEventTouchUpInside]; 
    [self.view addSubview:test]; 
    [test release]; 
    [window makeKeyAndVisible]; 
} 

- (void)testAction { 
    NSLog(@"Write something..."); 
} 

我得到这个神秘的错误。 :-(帮助

回答

8

解决方案!

我的问题是,我用在AppDelegate中下面的代码:

UIViewController *controller = [[MyCustomController alloc] init]; 
[window addSubview:controller.view]; 
[controller release]; 

因此,只有视图控制器的视图属性被保留和其他一切都被清除。视图控制器没有任何功能(没有触摸事件,没有实例方法)。这就是为什么addTarget:action:forEvents:不起作用的原因。

因此,做到这一点 - 在AppDelegate的dealloc中释放视图控制器。;)

+0

ARC引入后,解决方案稍有不同。现在你需要在头文件中声明UIViewController *控制器。所以它是类的一个成员变量,它在内部保留。 就像你知道的那样,不要把它叫做ARC。 – 2014-03-13 07:16:10

0

哪来则myButton被宣布 如果是合成的,然后代替

rightButton = [UIButton的 buttonWithType:UIButtonTypeCustom]!?

使用

self.rightButton = [UIButton buttonWithType:UIButtonTypeCustom]; 

应该工作。如果没有,请张贴你如何宣布财产。

+0

我不认为这是这里的问题。这个视图控制器以编程方式创建它的视图(根本没有xib文件)。该按钮只是该类中的一个实例变量(不是属性),因此: self.rightButton = ... 根本不编译。 我甚至在代码中创建了一个按钮。 UIButton * button2 = [UIButton buttonWithType:UIButtonTypeCustom]; ... [self.view addSubview:button2]; 当我没有添加目标和动作时,按钮呈现并正常动作。当我添加功能(addTarget:action:forEvents :)时,点击会引发异常。 – Teodor 2010-06-15 16:28:38

31

旧的文章,可能所有的现在进行排序,但还有另外一个问题,这将导致崩溃:

[test addTarget:self action:@selector(testAction) forControlEvents:UIControlEventTouchUpInside] 

不正确。 action:@selector(testAction)必须有一个冒号有这样的:

action:@selector(testAction:) 

,否则你会得到一个无法识别的选择崩溃 - 这是你做了什么..

+1

我希望我可以为此投票+100,你只是为我节省了几个小时的头疼。如果你错过冒号设置没有Id的选择器目标,但不是很有用。添加冒号会发挥魔力。 很少有我看到代码如此晦涩难懂并且很容易被忽略 – Cruachan 2011-06-27 19:14:19

+1

是的 - 刚刚碰到过这个自己---这个冒号很重要---谢天谢地skajam66写了这个回复。 – David 2011-08-16 19:22:37

+0

有同样的问题。感谢您指出这一点! – 2012-06-06 13:01:01