【问题标题】:How to passing class argument to selector in objective C?如何将类参数传递给目标C中的选择器?
【发布时间】:2012-01-05 15:34:26
【问题描述】:

我想通过点击按钮来设置类图块值

  • 如果单击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];
        }
    }
}

我有 onPlus 和 onMinus 方法,我想将对象图块发送到该方法

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

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

如何将对象 tile 传递给方法? 还是有别的办法??

【问题讨论】:

    标签: iphone objective-c ios5 xcode4.2 kobold2d


    【解决方案1】:

    CCMenuItemImage 继承自 CCNode,后者具有 void* userData 属性。如果将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
    }
    

    【讨论】:

    • 啊...顺便说一句,当暂停层用这两个按钮启动时。屏幕暂停但程序仍在运行...换句话说,我想等待按钮动作所以在我触摸按钮后......程序可以连续运行......所以我也想知道按钮的等待动作功能......
    • 如果程序仍在运行,它不会按照您编写的方式运行吗?您有机会尝试userData 技巧吗?
    • 您的代码有效,但在我的函数完成后它设置为@"+" 或@"-"。所以我得到了我不希望它成为的值@"P" .所以我想等到我按下按钮。
    • 我问的最新 2 条评论是一个新问题...问题是“如何等到 CCmenuItemImage 被按下???”
    【解决方案2】:

    如果您想将 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;
    }
    

    【讨论】:

      【解决方案3】:

      对于字符串比较,最好使用

      [tile.getVal isEqualToString:@"P"]
      

      因为您使用的方法仅在它是完全相同的字符串(在相同的内存位置)时才有效,而不是其他地方的等效字符串。

      【讨论】:

      • 这是一个有价值的观察,但 cmets 是一个更好的地方,因为它不是 OP 的问题。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-31
      • 2022-01-18
      • 2013-09-09
      • 2011-04-22
      • 1970-01-01
      相关资源
      最近更新 更多