0

の背後にあるロジックの一部を理解するのに苦労していUITableViewます。MPMediaItemCollection曲のキューとしてテーブルにデータを入力しています。私が達成しようとしているのは、現在再生中の曲と一致するインデックス パスのセルのアクセサリ ビューとして、現在再生中のインジケーターを表示することです。

私はもともと次のようにこれを試しました:

if (indexPath.row == [mutArray indexOfObject:[mainViewController.musicPlayer.nowPlayingItem valueForProperty:MPMediaItemPropertyTitle]]) {        
    UIImageView *playButtonView = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"PlayButton.png"]];
    [cell setAccessoryView:playButtonView];
}

これは、実際には常に である現在再生中のアイテムに対して正常に機能しますobjectAtIndex:0。しかし、私が理解していないのは、私のテーブルが、結合された可視セルの高さごとにこのインデックスを定義しているように見える理由です。

これをもっと明確に説明してみましょう。テーブルの高さが 600px で、コンテンツの高さが 1800px だとしましょう。これにより、インジケーターはコンテンツの高さの約 600 ピクセルごとに追加されます。

ここで、最初に考えたのは、これは曲の名前に基づいてインデックスを判断するためのコードに問題があるということでした。そのため、次のように変更してみました。

if (indexPath.row == 0)

しかし、これは同じ結果を生み出します!

このスクリーンショットは、私が話していることを説明するのに役立ちます。

ここに画像の説明を入力

indexPath0それで、現在表示されているセルを参照するのではなく、テーブル全体を参照して最初のセルのみとしてテーブルを扱うようにするためにできることはありますか?

4

2 に答える 2

2

アクセサリが存在しない場合も明示的に述べる必要があります。

if (indexPath.row==0) {
   UIImageView *playButtonView = [[UIImageView alloc] initWithImage:
     [UIImage imageNamed:@"PlayButton.png"]];
   [cell setAccessoryView:playButtonView];
} 
else {
   [cell setAccessoryView:nil];
}

その理由は、セル 0 が別の行でデキュー (再利用) されても、まだアクセサリ ビューが含まれているためです。

実際、これは、テーブル ビュー セルのデキューが実際にどのように機能するかを理解するための優れたケース スタディです ;-)。

于 2012-08-02T08:37:32.073 に答える
2

これが、テーブルビューがセルを再利用する方法です。セルが画面からスクロールアウトすると、再利用プールに追加されるため、アクセサリビューをセルに追加してそのセルを再利用すると、スクロール中にランダムな場所に表示されます。

セルのインデックスをチェックインし-willDisplayCell:forIndexPathて追加(追加されていない場合)、非表示(存在するが目的のインデックスではない場合)または表示(存在し、インデックスである場合)、またはすべてのセルにアクセサリビューを追加して表示/必要に応じて非表示にします。

于 2012-08-02T08:37:59.417 に答える