2012-01-05 24 views
2

私はクリックするとクリックした場合、それは文字列の値を持つことになりますonMinusそれは= @「+」 目的関数Cのクラス引数をセレクタに渡す方法は?

  • 文字列値を持つことになりますonPlusボタンをクリックするだけで

    • をクラスタイル値を設定したいです= @」 - 」ここ

  • はコード

    //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継承、 y。 tileuserDataに割り当てると、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

    ああ...一時停止層は、これら二つのボタン にアップしている途中で【選択画面が一時停止ですが、プログラムがまだ実行中...つまり 私はなるようにボタンアクションを待ちたいです私がボタンをタッチした後...プログラムは連続的に実行することができます... ボタン付きのアクションfuntionを待っています。 –

    +0

    プログラムがまだ実行中の場合あなたはそれをコード化しましたか? 'userData'トリックを試してみましたか? – dasblinkenlight

    +0

    あなたのコードは正常ですが、関数が終了した後は@ "+"または@ " - "に設定されています。そのため、私は値が "P"になります。私はボタンを押します。 –

    0

    あなたonPlusハンドラ、単にサブクラスCCMenuItemImageにTileオブジェクトを送信し、タイルのプロパティを作成する場合:

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

    はここにあなたのコードがどのように見えるかのラフ例ですvoid* userData propertを持ってCCNodeから

    - (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

    関連する問題