1

所以我用类方法创建了一个类 CommonMethods:

+ (CCMenu *)createMenu:(NSString *)menuName atPosition:(CGPoint)position {
    CCMenuItemImage *menuBlock = [CCMenuItemImage itemWithNormalImage:menuName selectedImage:menuName target:self selector:@selector(choose:)];
    CCMenu *menuBlockMenu = [CCMenu menuWithItems:menuBlock, nil];
    menuBlockMenu.position = position;
    return menuBlockMenu;
}

现在在包含选择方法的 MainClass 中,我创建了一个菜单:

CCMenu *regularBlockMenu = [CommonMethods createMenu:kbRegularBlock atPosition:position];
[self addChild:regularBlockMenu];

当我点击菜单时我的程序崩溃了,因为它不理解选择器调用。我该如何实施?我想创建一个 CommonMethods 方法,因为我将在许多类中一遍又一遍地使用这个方法。

谢谢你的帮助。

4

3 回答 3

1

由于self在类方法中引用了类,因此您不应该将self选择器作为目标:

CCMenuItemImage *menuBlock = [CCMenuItemImage itemWithNormalImage:menuName selectedImage:menuName target:self selector:@selector(choose:)];
//                                                                                            HERE ------^^^^

相反,您应该将选择器发送到响应选择器的对象choose:

于 2012-09-07T21:25:28.760 回答
1

您想在 MainClass 类中选择一个方法吗?如果是这样,您需要稍微修改您的 createMenu 函数。试试这个,

+ (CCMenu *)createMenu:(NSString *)menuName atPosition:(CGPoint)position forTarget:(id)target 
{
    CCMenuItemImage *menuBlock = [CCMenuItemImage itemWithNormalImage:menuName selectedImage:menuName target:target selector:@selector(choose:)];
    CCMenu *menuBlockMenu = [CCMenu menuWithItems:menuBlock, nil];
    menuBlockMenu.position = position;
    return menuBlockMenu;
}

然后在 MainClass 中:

CCMenu *regularBlockMenu = [CommonMethods createMenu:kbRegularBlock atPosition:position forTarget:self];
[self addChild:regularBlockMenu];

你需要-(void)choose:(id)sender;在 MainClass中定义

所以这样做是设置选择的目标:成为 MainClass 的一个实例,而不是 CommonMethods。

于 2012-09-07T22:17:58.147 回答
0

您需要使 CommonMethods 成为单例

@implementation CommonMethods
static CommonMethods* globalCommonMethods = nil;
+(CommonMethods*)gCommonMethods
{
    if( !globalCommonMethods ) globalCommonMethods = [[CommonMethods alloc] init];
    return globalCommonMethods;
}
-(CCMenu *)createMenu:(NSString *)menuName atPosition:(CGPoint)position {
    CCMenuItemImage *menuBlock = [CCMenuItemImage itemWithNormalImage:menuName selectedImage:menuName target:self selector:@selector(choose:)];
    CCMenu *menuBlockMenu = [CCMenu menuWithItems:menuBlock, nil];
    menuBlockMenu.position = position;
    return menuBlockMenu;
}

-(void)choose:(id)sender
{
    //do stuff
}

现在,当您需要访问 CommonMethods 时,请使用 [CommonMethods gCommonMethods]

于 2012-09-07T21:26:09.550 回答