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

时间:2012-09-07 21:18:57

标签: objective-c class

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

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

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

感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

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

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

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

的对象

答案 1 :(得分: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];

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

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

答案 2 :(得分: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]