UIButton addTarget: action: forControlEvents: результаты в [NSObject doesNotRecognizeSelector:] - PullRequest
5 голосов
/ 15 июня 2010

Я много чего перепробовал, все равно безрезультатно.

Итак, у меня есть следующая кнопка, созданная программно в подклассе 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...");
}

Я получаю эту загадочную ошибку. :-( Помогите!

Ответы [ 3 ]

31 голосов
/ 01 января 2011

Старая запись и, вероятно, все уже отсортированы, но есть другая проблема, которая приведет к сбою:

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

неверно.action:@selector(testAction) должно иметь двоеточие, таким образом:

action:@selector(testAction:)

, иначе вы получите нераспознанный сбой селектора - вот что вы получаете

8 голосов
/ 21 июня 2010

РЕШЕНИЕ!

Моя проблема заключалась в том, что я использовал следующий код в AppDelegate:

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

Таким образом, было сохранено только свойство view контроллера представления, а все остальное было очищено. Контроллер представления не имел никакой функциональности (никаких событий касания, никаких методов экземпляра). Вот почему addTarget: action: forEvents: не работает.

Итак, сделайте это умно - освободите ваши контроллеры представлений в свободном доступе AppDelegate. ;)

0 голосов
/ 15 июня 2010

где объявлено myButton?если он синтезирован, то вместо

rightButton = [UIButton buttonWithType: UIButtonTypeCustom];

используйте

self.rightButton = [UIButton buttonWithType:UIButtonTypeCustom];

, который должен работатьЕсли нет, пожалуйста, опишите, как вы декларируете собственность.

...