UITableView在场合重复第一个单元格

时间:2014-10-24 17:54:06

标签: ios uitableview

我的代码:

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

UITableViewCell *cell = nil;

NSString *homeDir = NSHomeDirectory();
if(indexPath.section == 0){
    homeDir = [NSString stringWithFormat: @"%@/%@", homeDir, @"Documents"];
}else{
    homeDir = [NSString stringWithFormat: @"%@/%@", homeDir, @"Documents/Archived"];
}
NSFileManager *fm = [NSFileManager defaultManager];
NSArray *dirContents = [fm contentsOfDirectoryAtPath:homeDir error:nil];

dirContents = [[dirContents reverseObjectEnumerator] allObjects];

cell  = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];

if (cell == nil) {
    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:@"MyCell"];
}

UILongPressGestureRecognizer *lpgr = [[UILongPressGestureRecognizer alloc]
                                      initWithTarget:self action:@selector(handleLongPress:)];
lpgr.minimumPressDuration = 1.3; //seconds
[cell addGestureRecognizer:lpgr];

int i = 0;
NSString *filename;
if([dirContents count] > 0){
    filename = [[dirContents objectAtIndex:indexPath.row] lastPathComponent];
    while(![[filename substringFromIndex: [filename length] - 3] isEqualToString:@"pdf"]){
        i ++;
        filename = [[dirContents objectAtIndex:indexPath.row + i] lastPathComponent];
    }
}else{
     filename = @" ";
}


cell.textLabel.text = filename;

return cell;

}

我遇到的问题是,有时只有第一个单元格会重复返回。如果数组读取"红色,蓝色,绿色,黄色"它看起来像是:

红色

红色

红色

红色

这种情况只会偶尔发生。有时刷新表时,它会正确显示,以后才会恢复到不正确的显示。我做错了什么?

2 个答案:

答案 0 :(得分:1)

我在上面发表评论,但我会尝试回答,因为我怀疑这会解决你的问题,如果不只是为了展示这里发生的事情。

UITableView应该有一个数据源。在原始代码中,每次表视图创建新单元格时,您都要创建此数据源(数组dirContents)。看起来您的数据源是静态的,因此您可以在UITableViewDataSource委托方法之外创建它,并将其放在某个位置,例如viewDidLoad方法。我的一个假设是,没有及时创建这个数组来访问你单元格的元素。

然后,您可以在cell.textLabel.text = filename;之前确认您的单元格正在使用NSLog从此数组中获取正确的索引。

希望这可以帮助您解决问题。

答案 1 :(得分:1)

Marcel,你必须重新设计你的代码,你已经从viewDidLoad目录中获取了文件名的代码,并将这些名称保存在一个全局数组中,然后在cellForRowAtIndex中使用这个数组。 要在每次下载时刷新tableView,只需重新加载uitableview,因为文件完全被下载。希望它能帮助你!