我嘗試了很多東西,仍然沒有結果。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...");
}
我得到這個神祕的錯誤。 :-(幫助
ARC引入後,解決方案稍有不同。現在你需要在頭文件中聲明UIViewController *控制器。所以它是類的一個成員變量,它在內部保留。 就像你知道的那樣,不要把它叫做ARC。 – 2014-03-13 07:16:10