2

ボタンを押すと曲を再生するプロトタイプセルを持つ動的テーブルビューがあります。

ユーザーがボタンを押して曲を再生すると、ボタンの背景画像が「停止」アイコンに変わり、ユーザーがもう一度押して停止すると「再生」アイコンに変わります。歌。

これを達成するために、私は使用しようとしてきました: [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
4

2 に答える 2

2

あなたが提案したように、タグを使用してください。cellForRowAtIndexPathメソッドで、各セルにタグを付けます。

cell.tag = indexPath.row;

また、セルに各ターゲットを設定します。

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

次に、play メソッドで、配列にタグを使用するか、次のようにします。

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

     }
}

::編集::(コメントへの回答)

他のボタンを無効にするには、play メソッドで次のようにします。

- (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 で行われます。

于 2012-07-03T00:02:36.283 に答える
2

target/action を使用しているため、sender 引数にはタップされたボタンが含まれます。ボタンを self.beatPlayButton として参照する代わりに、sender を使用するだけです。[sender setBackgroundImage:[UIImage imageNamed:@"play.png"] forState:UIControlStateNormal];

于 2012-07-03T00:14:12.190 に答える