2012-01-05 54 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

相關問題