0

カスタムを作成しました。UITableViewCell各セルには、AVPlayerからオブジェクトのカスタムサブクラスが渡されますUITableViewController。各セルには、再生ボタン、一時停止ボタン、読み込みインジケーターがあります。

オーディオを再生すると、要素は必要に応じて機能し、プレーヤーの状態が変化すると変化します。たとえば、再生中、一時停止ボタンが表示され、再生ボタンが消えます。2番目のセルでオーディオを再生すると、最初のセルはこれを認識し、ボタンの状態をリセットし、2番目のセルが処理を実行します。

したがって、この機能は完全に機能します。唯一の問題は、UITableViewCellが再利用されるためです。下のセルまでスクロールすると、一時停止ボタンが表示され始めます。これは、これらが上記のセルと同じ(再利用)セルであり、私のセルがカスタムサブクラスのデリゲートであるためAVPlayer、オーディオプレーヤーが正しいセルではないセルにメッセージを送信しているためです。

UITableViewCellそれぞれを個別のデリゲートオブジェクトにするために何ができAVPlayerますか?

4

3 に答える 3

1

再利用時にセルから要素を削除する必要があります。

UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
} else {
    /* prepare for reuse */
    [cell.playButton removeFromSuperview];
    /* or */
    [[cell viewWithTag:10] removeFromSuperview];
}
于 2012-09-02T16:26:11.687 に答える
0

JSONブロブからロードしている画像でも同じ問題がありました。GCD を使用して、各セルに割り当てられたキーとペアになった NSDictionary に画像を保存しました。

- (UIImage *)imageForRowAtIndexPath:(NSIndexPath *)indexPath
{    
    // get the dictionary for the indexPath
    NSDictionary *tweet = [tweets objectAtIndex:[indexPath row]];

    // get the user dictionary for the indexPath
    NSDictionary *user = [tweet objectForKey:@"posts"];

    //get the image URL
    NSURL *url = [NSURL URLWithString:[[[[[tweet objectForKey:@"photos"] objectAtIndex:0] objectForKey:@"alt_sizes"] objectAtIndex:3] objectForKey:@"url"]];

    // get the user's id and check for a cached image first
    NSString *userID = [user objectForKey:@"id"];
    UIImage *image = [self.images objectForKey:userID];
    if(!image)
    {

        // if we didn't find an image, create a placeholder image and
        // put it in the "cache". Start the download of the actual image
        image = [UIImage imageNamed:@"Placeholder.png"];
        [self.images setValue:image forKey:userID];

        //get the string version of the URL for the image
        //NSString *url = [user objectForKey:@"profile_image_url"];

        // create the queue if it doesn't exist
        if (!queue) {
            queue = dispatch_queue_create("image_queue", NULL);
        }

        //dispatch_async to get the image data
        dispatch_async(queue, ^{

            NSData *data = [NSData dataWithContentsOfURL:url];
            UIImage *anImage = [UIImage imageWithData:data];
            [self.images setValue:anImage forKey:userID];
            UITableViewCell *cell = [self.tableView cellForRowAtIndexPath:indexPath];

            //dispatch_async on the main queue to update the UI
            dispatch_async(dispatch_get_main_queue(), ^{
                cell.imageView.image = anImage;
            });
        });


    }

    // return the image, it could be the placeholder, or an image from the cache
    return image;
}
于 2012-09-02T15:33:37.193 に答える
-1

UITableViewControllerオーディオ プレーヤーのデリゲートを作成することで問題を解決しました。次に、「現在再生中」のセルをindexPathに保存@propertyUITableViewControllerます。

次に- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath、indexPath が「現在再生中」のセルと同じかどうかを確認し、同じindexPath場合は「オーディオ再生」ボタンの配置を設定し、そうでない場合はデフォルトのボタン配置を設定します。

indexPathこれは、セルを比較するための一意の識別子があるため、セルを区別するのに適しています。

于 2012-09-02T16:48:02.747 に答える