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

choose: メソッドを含む 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で定義する必要があります

つまり、choose: のターゲットを、CommonMethods ではなく MainClass のインスタンスに設定しています。

于 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 に答える