Objective-C:将选择器传递给对象

时间:2010-10-04 17:42:44

标签: iphone objective-c cocos2d-iphone selector

我正在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 个答案:

答案 0 :(得分:1)

目标不能是自我。目标必须是实现您创建的按钮的类。

在创建按钮时传入选择器时,还要传递按钮创建类的目标。

换句话说,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
}

答案 1 :(得分:0)

有一些问题可能是问题,但它们都没有与传递选择器有关:

  1. 您正在传递self(在类方法中是CCButton类)作为按钮的目标,但CCButton没有相应的类方法,而且几乎肯定不是对象你打算回应这个行动。

  2. 你的方法说它返回一个CCButton,但你实际上是在返回一个CCMenu。除非CCButton和CCMenu在结构上相同(即CCButton没有实例变量),否则这几乎可以保证导致崩溃,并且在任何情况下都是错误的。