重用表格单元格问题

时间:2012-05-31 21:10:48

标签: iphone objective-c ios uitableview

我认为我错误地实施了cellForRowAtIndexPath。我有一个默认隐藏的UISlider,当在表格单元格中按下按钮时出现。当我按下第一个单元格中的按钮时,滑块不仅出现在第一个单元格中,而且出现在每个向下滚动的第三个单元格中。我目前通过将滑块的隐藏属性重置为YES中的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;
}

2 个答案:

答案 0 :(得分:3)

您需要在某个地方的数据模型中存储滑块的隐藏/取消隐藏状态,然后根据cellForRowAtIndexPath中的滑块的可见性进行适当设置。如果一次只能看到一个滑块,则可以将索引路径存储为视图控制器中的ivar,否则则需要在字典中使用另一个键来保存NSNumber bool等。

答案 1 :(得分:1)

您的问题是当您向下滚动时正在重复使用您的单元格。因此,如果滑块对于滚出视图的单元格是可见的,则该单元格将被重用,因此滑块仍然可见。

要避免此自定义单元格中的此工具prepareForReuse在重复使用单元格后立即重置滑块。

接下来,您仍然需要在模型中存储滑块的状态,这样一旦该对象返回视图,您就可以恢复该状态。

prepareForReuse

中设置自定义单元格的默认状态是一种很好的做法