0

私は間違って実装していると思いますcellForRowAtIndexPath。デフォルトでは非表示になっていUISliderて、表のセルでボタンを押すと表示される があります。最初のセルのボタンを押すと、最初のセルだけでなく、下にスクロールすると 3 つおきのセルにもスライダーが表示されます。現在、スライダーの隠しプロパティをYESin にリセットすることでこれを回避していcellForRowAtIndexPathます。デフォルトで非表示にする必要があるセル内の他のビューに対してもこれを行います。これにより、最初のセルまでスクロールして戻ると、新しい問題が発生します。プロパティが でリセットされるため、スライダーが非表示になりますcellForRowAtIndexPath。これにより、私は何か間違ったことをしていると信じるようになります。

これが私のコードです:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{

static NSString *CellIdentifier = @"Cell";

SongsCustomCell *songCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];

if (songCell == nil) {
    songCell = [[SongsCustomCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    NSLog(@"new cell created");
}

NSDictionary *dictionary = [parseTrackArray objectAtIndex: indexPath.row];
NSString *trackTitle = [dictionary objectForKey:@"trackTitle"];
NSString *trackLink = [dictionary objectForKey:@"trackStreamLink"];
songCell.trackLinkString = trackLink;
songCell.trackTitleString = trackTitle;
[songCell.trackTitleLabel setFont:[UIFont fontWithName:@"Calibri" size:22]];
songCell.trackTitleLabel.text = [NSString stringWithFormat:@"%@", trackTitle];

songCell.playButton.hidden = NO;
songCell.playbackSlider.hidden = YES;
songCell.playerHasLoaded = NO;
songCell.moviePlayer.view.hidden = YES;

return songCell;
}
4

2 に答える 2

3

スライダーの非表示/非表示のステータスをデータ モデルのどこかに保存し、cellForRowAtIndexPath からスライダーの可視性を適切に設定する必要があります。一度に 1 つのスライダーしか表示されない場合は、インデックス パスを ivar としてビュー コントローラーに格納できます。そうでない場合は、辞書に NSNumber bool などを保持する別のキーが必要になります。

于 2012-05-31T21:17:34.330 に答える
1

あなたの問題は、下にスクロールしているときにセルが再利用されていることです。したがって、スクロールして表示されないセルにスライダーが表示されている場合、そのセルは再利用されるため、スライダーは引き続き表示されます。

これを回避するprepareForReuseには、セルが再利用されるとすぐにスライダーをリセットするようにカスタム セルに実装します。

次に、スライダーの状態をモデルに保存する必要があるため、オブジェクトがビューに戻ってきたら、その状態を復元できます。

カスタムセルのデフォルト状態を設定することをお勧めしますprepareForReuse

于 2012-05-31T21:17:30.253 に答える