Objective-C: передача селектора к объекту - PullRequest
0 голосов
/ 04 октября 2010

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

#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
}

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

Спасибо за помощь, Дэйв

Редактировать: ошибка, которую я получаю, неверный указатель, SIGABRT

Ответы [ 2 ]

1 голос
/ 04 октября 2010

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

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

Inдругими словами, target - это класс, который содержит метод, который вы передаете в качестве селектора.

Надеюсь, что все прояснилось:)

PS: Вот что вы должны попробовать.Обратите внимание, что ваш buttonFromImage теперь принимает целевой атрибут, который устанавливается при создании кнопки.Кроме того, цель, которую вы устанавливаете в своем buttonFromImage, - это не self, а цель, которая приходит из метода 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 голосов
/ 04 октября 2010

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

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

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

...