2

눌렀을 때 노래를 재생하는 단추가있는 프로토 타입 셀이있는 동적 테이블보기가 있습니다.UITableview에서 누른 특정 단추의 이미지 변경

사용자가 단추를 눌러 노래를 재생하면 단추의 배경 이미지가 "중지"아이콘으로 변경되고 사용자가 단추를 누르면 "재생"아이콘으로 변경됩니다. 다시 한번 노래를 멈추게합니다. [self.beatPlayButton setBackgroundImage:[UIImageimageNamed:@"play.png"]forState:UIControlStateNormal];

내 문제는 내가 프로토 타입을 사용하고 있기 때문에 누르고있는 행에만 버튼을 변경하는 방법을 알아 냈하지 않은 것입니다 :

내가 사용하려고했는데이 작업을 수행하려면 세포. 나는 didSelectObjectAtRow:atIndexPath:과 같은 메서드를 찾으려고했는데, 행이 눌려 졌을 때 didSelectRowAtIndexPath:이 실행되지만, 오타가 아닌 한이 버튼이 실행되지 않기 때문입니다. 아마 내가 꼬리표를 사용해야 할까? 나는 잘 모르겠다. 모든 포인터 크게 감사하겠습니다.

편집 : 내 코드가 didSelectRowAtIndexPath 외부입니다.

- (IBAction)playStopBeat:(UIButton*)sender event:(id)event { 
    NSSet *touches = [event allTouches]; 
    UITouch *touch = [touches anyObject]; 
    CGPoint currentTouchPosition = [touch locationInView:self.tableView]; 
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint: currentTouchPosition]; 
    if([self.audioPlayer isPlaying]) 
    { 
     [self.beatPlayButton setBackgroundImage:[UIImage imageNamed:@"play.png"]forState:UIControlStateNormal]; 
     [self.audioPlayer stop]; 
     self.isPlaying = NO; 
     self.audioPlayer = nil; 
    } 
    else { 

     if (indexPath.row == 0) { 
      [self.beatPlayButton setImage:[UIImage imageNamed:@"stop.png"] forState: UIControlStateNormal]; 
     } 
     else if (indexPath.row == 1){ 
      [self.beatPlayButton setBackgroundImage:[UIImage imageNamed:@"stop.png"]forState:UIControlStateNormal]; 
     } 
     else if (indexPath.row == 2){ 
... 
//code to play song 
+0

입니까? –

+0

몇 가지 코드를 제공 할 수 있습니까? 버튼과 연관된 액션은 무엇입니까? – sergio

+0

더 많은 문맥을 제공하기 위해 제 질문을 업데이트했습니다. 감사. –

답변

2

태그를 사용하여, 당신은 제안처럼 -

다음은 샘플 코드입니다. 해당 재생 방법이어서

[cell.playButton addTarget:self action:@selector(play:)forControlEvents:UIControlEventTouchUpInside]; 

어레이 또는 w/E에 대한 태그를 사용 : 또한 세포에 각 타겟 설정

cell.tag = indexPath.row; 

: 당신 cellForRowAtIndexPath 방법에서 각 셀에게 태그를 제공

- (IBAction)play:sender 
{ 
    UITableViewCell *cell = (UITableViewCell *)sender; 
    NSLog(@"tag = %d", cell.tag); 

    if(tag == 0) 
    { 
      //you could also use a switch statement 
    } else if(tag == 1) { 

    } 
} 

:: 편집 : 당신의 괞 찮아에,

가 다른 버튼을 사용하지 않으려면 (대답은 언급합니다) y 방법 :

- (IBAction)play:sender 
{ 
    ......... 
    ....other code.... 

    UITableViewCell *cell = (UITableViewCell *)sender; 

    for(int i = 0; i < [dataArray count]; i++) 
    { 
     UITableViewCell *tempCell = [tableView cellForRowAtIndexPath:[NSIndexPath indexPathForRow:i inSection:0]]; 

     if(tempCell.tag != cell.tag) 
     { 

      [cell.playButton setEnabled:NO]; 
     } 
    } 
} 

이렇게하면 노래를 재생 한 후에 모두 다시 활성화로 설정해야합니다. 이 작업은 MediaPlayers 대리자 메서드에서 수행됩니다. didFinishPlaying.

+0

내 친구에게 감사드립니다. 나는 너의 도움으로이 일을 할 수 있었다. –

+0

다른 태그 색인에서 버튼과의 상호 작용을 비활성화하는 방법이 있는지 알고 계십니까? 예를 들어 5 행이 있고 태그 # 2에서 버튼을 누른 경우 0-1 및 3-5 태그의 버튼이 비활성화됩니다. 당신이 알고 있다면 나는 다른 질문을 던질 수 있고 당신이 대답 할 수 있도록 그것에 대한 링크를 둘 수 있습니다. –

+0

@OrpheusMercury 방금 원래 응답에 코드를 추가했습니다. 도움이되는지 알려주세요. 나는 그것이 유효해야한다고 생각하지만, 나는 xcode에서 테스트하지 않았다. – RyanG

2

target/action을 사용하고 있으므로 발신자 인수에는 탭 한 버튼이 포함됩니다. self.beatPlayButton이라는 버튼을 참조하는 대신 발신자를 사용하십시오. 따라서 'didSelectRowAtIndexPath` 또는 버튼에 의해 전송 된 동작에서 일어나는 동작은 [sender setBackgroundImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];

+0

나는 이것을 깨닫고 그것을 조정했다. 당신은 절대적으로 옳습니다. +1 –