类方法包含对另一个类的方法的选择器调用



所以我用类方法创建了一个类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中,它包含chool:方法,我创建了一个菜单:

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

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

谢谢你的帮助。

您想在类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];

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

因此,这是在设置choose的目标:成为MainClass的实例,而不是CommonMethods。

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

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

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

您需要使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时,请使用[CommonMethodsgCommonMethods]

最新更新