UITableview慢速滚动或单元格位置不匹配

时间:2015-11-22 07:43:17

标签: ios objective-c uitableview

我的<%= f.date_select :start_date, :label => "When does this project begin?", 'data-behaviour' => 'datepicker', order: [:day, :month, :year] %> ,滚动时滞后。这是我的代码:

UITableView

我的方法从文档方向获取图像:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    CellListsFriend *cell = [tableView dequeueReusableCellWithIdentifier:@"cellListsFriend" forIndexPath:indexPath];
    if (!cell.selected) {
        cell.accessoryType = UITableViewCellAccessoryNone;
    }
    ContactAlphaB *contact = [self objectAtIndexPath:indexPath];
    NSMutableAttributedString *strFullname;
    if (strFullname == nil) {
        strFullname = [NSString DrawColorForFullname_firstName:contact.firstName lastName:contact.lastName];
    }
    cell.lblNameFriend.attributedText = strFullname;
    cell.lblStatusSentense.text = contact.usernameIsUsing;
    [cell.lblStatusSentense setTextColor:[SomeMethods_TrinhVM TrinhVM_colorWithHexString:color_status_ShowUser]];
    if ([contact.registerType isEqualToString:@"1"]) {
        cell.lblRegisterType.text = @"Email";
    }
    else{
        cell.lblRegisterType.text = @"Mobile";
    }
    [NSURLConnection getImage:contact.linkAvatar showImage:cell.imgAvatarFriends];
    [cell.lblRegisterType setTextColor:[SomeMethods_TrinhVM TrinhVM_colorWithHexString:@"777777"]];
    // Rounded Rect for cell image
    cell.imgAvatarFriends.layer.borderWidth=2;
    cell.imgAvatarFriends.layer.borderColor=[[UIColor whiteColor]CGColor];
    [cell.imgAvatarFriends.layer setCornerRadius:cell.imgAvatarFriends.frame.size.width/2];
    [cell.imgAvatarFriends.layer setMasksToBounds:YES];
    return cell;
}

我已经研究过并使用过:

+(UIImageView *)getImage:(NSString*)strImageName showImage:(UIImageView*)showImage{
    NSString* fileName = [NSString stringWithFormat:@"%@",strImageName];
    NSArray *arrayPaths =
    NSSearchPathForDirectoriesInDomains(
                                        NSDocumentDirectory,
                                        NSUserDomainMask,
                                        YES);
    NSString *path = [arrayPaths objectAtIndex:0];
    NSString* pdfFileName = [path stringByAppendingPathComponent:fileName];
    NSData *data = [NSData dataWithContentsOfFile:pdfFileName];
    UIImage *image1 = [UIImage imageWithData:data];
    showImage.image = image1;
    return showImage;
}

我的代码已编辑如下:

dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0ul);
    dispatch_async(queue, ^{

它不会滞后,但会移动单元格的位置。如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

dispatch_async(queue, ^{
    cell.lblNameFriend.attributedText...
    etc.
}

<强>风险

看起来非常危险:你基本上是在事实后更改的单元格内容。您正在修改的单元格可能不是原始单元格,它可能已经被重用。如果你没有使用dequeueReusableCellWithIdentifier,基本上允许系统缓存单元格,并按照恰当的名称回收它们,这种方法就可以工作。

<强>安全

正确的方法接近但与你正在做的完全相同。您可以继续利用dequeueReusableCellWithIdentifier,但是当数据(图像等)可用时,您需要触发重新加载单元格。

换句话说,当您从以下位置返回单元格时

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

您可能无法保留指向该单元格的指针供以后使用。但是,当数据可用时,您可以要求系统根据需要多次重绘该单元格。