Как передать аргумент класса селектору в цель C? - PullRequest
2 голосов
/ 05 января 2012

Я хочу установить значение плитки класса, нажав на кнопку

  • , если нажать на плюс, у него будет строковое значение = @ "+"
  • , если нажать на Минус, это будетесть строковое значение = @ "-"

вот код

//Class Tile

@interface Tile : TouchableNode {
     NSString *val;
}

-(void) setVal:(NSString *)v
{
    val = v;
}

-(NSString *) getVal
{
    return val;
}

А в другом классе

У меня есть такой код

for(Tile *tile in player)
{
    if (tile.getVal == @"P") {
        if (pauseStatus == 0) {
            pauseStatus = 1;

            [[CCDirector sharedDirector] pause];
            CGSize size = [[CCDirector sharedDirector] winSize];
            pauseLayer=[[CCLayer alloc] init];
            pauseLayer.anchorPoint=ccp(0,0);
            pauseLayer = [CCLayerColor layerWithColor: ccc4(0, 0, 255, 125) width: 300 height: 150];
            pauseLayer.position = ccp(size.width/2, size.height/2);       
            pauseLayer.isRelativeAnchorPoint = YES;
            [self addChild: pauseLayer z:8];

            //Here are 2 two button that when user click it will have @"+" value or @"-"
            plusBtn = [CCMenuItemImage itemFromNormalImage:@"plus.png" selectedImage:@"plus.png"     target:self selector:@selector(onPlus:)];
            minusBTn = [CCMenuItemImage itemFromNormalImage:@"minus.png" selectedImage:@"minus.png"      target:self selector:@selector(onMinus:)];

            pauseMenu = [CCMenu menuWithItems:plusBtn, minusBTn, nil];
            [pauseMenu alignItemsHorizontally];
            [self addChild:pauseMenu z:10];
        }
    }
}

и у меня есть метод onPlus & onMinus, который я хочу отправить плитку объекта этому методу

-(void)onPlus:(Tile *) set
{
    NSString *plus = @"+";
    [set setVal:plus];
}

-(void)onMinus:(Tile *) set
{
    NSString *minus = @"-";
    [set setVal:minus];
}

Как передать плитку объекта в метод ??Или у него есть другой способ сделать это?

Ответы [ 3 ]

0 голосов
/ 05 января 2012

CCMenuItemImage наследуется от CCNode, который имеет свойство void* userData.Если вы назначите tile для userData, вы можете получить его обратно из (id)sender в ваших onPlus / onMinus методах.

plusBtn = [CCMenuItemImage itemFromNormalImage:@"plus.png" selectedImage:@"plus.png"     target:self selector:@selector(onPlus:)];
plusBtn.userData = (void*)tile; // You may need a bridge cast in ARC
minusBTn = [CCMenuItemImage itemFromNormalImage:@"minus.png" selectedImage:@"minus.png"      target:self selector:@selector(onMinus:)];
minusBTn.userData = (void*)tile;

-(void)onPlus:(id)senderObj {
    CCNode *sender = (CCNode*)senderObj;
    Tile *myTile = (Tile*)sender.userData; // Again you may need a bridge cast here
}
0 голосов
/ 05 января 2012

Для сравнения строк лучше использовать

[tile.getVal isEqualToString:@"P"]

Поскольку используемый вами метод работает, только если он точно такой же строки (в той же ячейке памяти), в отличие от эквивалентной строки в другом месте.

0 голосов
/ 05 января 2012

Если вы хотите отправить объект Tile в обработчик onPlus, просто создайте подкласс CCMenuItemImage и создайте свойство Tile:

@interface MyCustomCCMenuItemImage : CustomCCMenuItemImage
@property (nonatomic, retain) Tile* tile;
@end

Вот грубый пример того, как может выглядеть ваш код:

- (void)someMethod
{

    for(Tile *tile in player)
    {
        plusBtn = [MyCustomCCMenuItemImage itemFromNormalImage:@"plus.png"   selectedImage:@"plus.png" target:self selector:@selector(onPlus:)];
        plusBtn.tile = tile ;
    }

}

//Your handler
-(void)onPlus:(id)sender
{
    Tile *myTile = sender.tile;
}
...