2012-01-05 2 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 상속 와이. 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

아 ... 일시 정지하지만 프로그램은 여전히 ​​즉 내가 있도록 버튼의 행동을 기다리고 싶지 ... 실행 버튼을 터치 한 후 ... 프로그램이 계속 실행될 수 있습니다 ... 버튼을 사용하여 작업 기능을 기다리는 것을 알고 싶습니다. –

+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

관련 문제