2010-10-04 3 views
0

Я реализую класс кнопки в cocos2d, и я хочу иметь возможность передавать селектор при создании кнопки. Вот Button.m:Objective-C: Передача селектора объекту

#import "CCButton.h" 


@implementation CCButton 

+(CCButton*) buttonFromImage:(NSString*)image selectedImage:(NSString*)selectedImage atPosition:(CGPoint)position selector:(SEL)selector_method 
{ 
    CCMenuItem *menuitem = [CCMenuItemImage itemFromNormalImage:image selectedImage:selectedImage target:self selector:selector_method]; 

    menuitem.position = position; 
    CCButton *menu = [CCMenu menuWithItems:menuitem, nil]; 
    menu.position = CGPointZero; 
    return menu; 
} 

@end 

Он наследуется от CCMenu. То, что я хочу сделать, это определить метод выбора везде, где будет создана моя кнопка. Например, если у меня есть меню, я хочу селектор, чтобы быть в меню, и назначить селектор на кнопку (в menu.m):

backButton = [CCButton buttonFromImage:@"image1.png" selectedImage:@"image2.png" atPosition:ccp(120,70) selector:@selector(backTouched:)]; 
     [self addChild:backButton z:1]; 

... 

- (void)backTouched:(id)sender { 
    //do what i want the button to do here 
} 

Это происходит сбой, когда я прикасаюсь к кнопке. Как мне реализовать то, что я хочу?

Спасибо за помощь, Dave

Изменить: Я получаю ошибку плохой указатель, SIGABRT

+0

что сказать, когда он падает? – cobbal

+0

Я получаю плохой понтер: SIGABRT –

ответ

1

Цель не может быть самостоятельной. Цель должна быть классом, который реализует созданную вами кнопку.

При передаче в селекторе при создании кнопки также передается цель создания класса кнопки.

Другими словами, цель - это класс, содержащий метод, который вы передаете в качестве селектора.

Надежда, что сделал вещи ясно :)

PS: Вот что вы должны попробовать. Обратите внимание, что теперь ваша кнопкаFromImage принимает атрибут цели, который задается при создании подкладки. Кроме того, цель, которую вы установили в вашей кнопкеFromImage, - это не я, а цель, которая входит в метод buttonFromImage.

@implementation CCButton 

+(CCButton*) buttonFromImage:(NSString*)image selectedImage:(NSString*)selectedImage atPosition:(CGPoint)position selector:(SEL)selector_method target: (id)target 
{ 
    CCMenuItem *menuitem = [CCMenuItemImage itemFromNormalImage:image selectedImage:selectedImage target:target selector:selector_method]; 

     menuitem.position = position; 
     CCButton *menu = [CCMenu menuWithItems:menuitem, nil]; 
     menu.position = CGPointZero; 
     return menu; 
} 

@end 

//************************************************* 

backButton = [CCButton buttonFromImage:@"image1.png" selectedImage:@"image2.png" atPosition:ccp(120,70) selector:@selector(backTouched:) target:self]; 
[self addChild:backButton z:1]; 

//... 

- (void)backTouched:(id)sender 
{ 
    //do what i want the button to do here 
} 
+0

работает как очарование! благодаря! :) –

+0

приветствую :) – Sid

0

Есть несколько вещей, которые могли бы быть проблемой, но ни один из них не имеет ничего общего с пропусканием селектор:

  1. Вы проходя self (что в методе класса это класс CCButton) в качестве цели кнопки, но у CCButton нет соответствующего метода класса, и это почти наверняка не тот объект, который вы намереваетесь ответить на действие.

  2. Ваш метод говорит, что он возвращает CCButton, но вы фактически возвращаете CCMenu. Если CCButton и CCMenu не являются структурно идентичными (т. Е. CCButton не имеет переменных экземпляра), это почти гарантированно приведет к сбою, и в любом случае это неверно.

Смежные вопросы