2012-01-05 43 views
2

我想设置的按钮被点击类瓷砖价值如何将类参数传递给目标C中的选择器?

  • 如果点击onPlus它将有一个字符串值= @“+”
  • 如果点击onMinus它将有一个字符串值= @” - ”

这里的代码

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

一个代码,我有我想要的对象瓷砖发送到该方法

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

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

如何传递对象瓷砖的方法onPlus & onMinus方法? 或者它有另一种方式使它?

回答

0

CCMenuItemImage继承年。如果您将tile指定为userData,则可以使用onPlus/onMinus方法中的(id)sender将其取回。

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

啊......通过在暂停层了这两个按钮 .The屏幕的方式是暂停,但程序还在运行...... 换句话说,我要等待按钮动作,使当我触摸按钮...程序可以连续运行... 所以我想知道一个等待按钮的动作功能.. – 2012-01-06 02:55:14

+0

如果程序仍在运行,它不会只是工作的方式你编码它?你有机会尝试'userData'技巧吗? – dasblinkenlight 2012-01-06 04:27:10

+0

你的代码是可以工作的,但是在我的函数完成之后它会设置为@“+”或者@“ - ”。所以我得到了@“P”的值,我不希望它是这样。所以我想等到我按下按钮。 – 2012-01-06 06:20:56

0

如果你想一个Tile对象发送到您的onPlus处理程序,只要继承CCMenuItemImage做出了瓷砖特性:

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

这里是你的代码可能会是什么样子粗糙例如:

CCNode,其具有 void* userData PROPERT
- (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; 
} 
0

对于字符串比较,你就要去使用

[tile.getVal isEqualToString:@"P"] 

由于您使用的方法,如果它是完全相同的字符串(在相同的内存位置)只有更好地工作,而不是等价其他字符串。

+0

这是一个很有价值的观察,但评论是一个更好的地方,因为它不涉及OP的问题。 – dasblinkenlight 2012-01-05 16:01:39

相关问题