UITableViewCell重用单元重复值

时间:2015-11-21 07:32:24

标签: ios objective-c uitableview

我在重用UITableViewCell方面遇到了经典问题。我知道问题是什么,但我无法弄清楚我做错了什么或如何解决它。屏幕首次渲染时,一切看起来都很棒。但是当用户滚动时,相同的图像和文本以8行的集合重复显示。

在方法结束时,我打印出应该显示的文本值。这个值看起来很棒,indexPath.row值也是如此。我无法正确地重复使用这些细胞。

我没有关闭图像刷新代码,因为它有点复杂,与主要问题无关。请关注文本更新,并确保图像更新将遵循类似的模式。

我认为我正在正确设置单元格。每个子视图仅添加到cell==nil块内。然后,我尝试更改此块之外的文本。但不知怎的,它没有得到正确的指针引用???我被卡住了。

- (UITableViewCell *) tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *cellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

    MyObject *obj = [self.fetchedObjects objectAtIndex:indexPath.row];
    UILabel *name;
    UIImageView *imgView;

    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier];

        name = [[UILabel alloc] init];
        name.frame = CGRectMake(40, 0.0, _tableView.frame.size.width-40, 44);
        name.adjustsFontSizeToFitWidth = YES;
        name.minimumScaleFactor = 0.5;
        [cell addSubview:name];

        imgView = [[UIImageView alloc] init];
        imgView.frame = CGRectMake(0, 4, 36, 36);
        imgView.image = [UIImage imageNamed:@"myimage.png"];
        [imgView setContentMode:UIViewContentModeScaleAspectFit];
        [cell addSubview:imgView];
    }

    // this has to be outside the `cell == nil` block, right???        
    name.text = obj.name;

    // this output is perfect - but the actual cells are repeated!
    NSLog(@"indexpath: %d", indexPath.row);
    NSLog(@"name from array: %@", obj.name);

    return cell;
}

2 个答案:

答案 0 :(得分:3)

如上所述,重复使用的单元格的nameimgView值将为nil

您需要在else语句中添加if,才能通过访问单元格中的现有视图来设置nameimgView

答案 1 :(得分:1)

  

//这必须在$('#share_schedule').click(function(){ if ($('#share_url_ul').children().length >= 1){ $('#share_url_ul').empty(); } // Take care of no classes case "You cannot share an empty schedule." $.ajax({ method: "POST", url: "/share/", data: JSON.stringify(localStorage), contentType: "application/json; charset=utf-8", dataType: "text", success: function(response){ var shared_url = document.createElement('a'); $(shared_url).css('display', 'block'); $(shared_url).attr('href', window.location.href + 'shared/' + response); $(shared_url).attr('id', 'share_link'); shared_url.innerHTML = window.location.href + 'shared/' + response; $('#share_url_ul').append(shared_url); $('#fb_share_btn').attr('data-href', window.location.href + 'shared/' + response); }, error: function(error){ console.log(error); } }); }); 区之外,对吧???      name.text = obj.name;

这是不正确的。当细胞不是零时,名称标签&图像视图根本没有分配。如果您坚持这样做,确实有一种方法可以解决您的问题(使用视图标记):

cell == nil

BUT

我认为你不需要创建新标签&单元格的图像视图,UILabel *name; UIImageView *imgView; NSInteger nameTag = 101; NSInteger imgViewTag = 102; if (cell == nil) { cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellIdentifier]; name = [[UILabel alloc] init]; name.tag = nameTag; ... [cell addSubview:name]; imgView = [[UIImageView alloc] init]; imgView.tag = imgViewTag; ... [cell addSubview:imgView]; } else { name = (UILabel *)[cell viewWithTag:nameTag]; imgView = (UIImageView *)[cell viewWithTag:imgViewTag]; } name.text = obj.name; ... & imageView可用于UITableViewCell。您可以像这样更新它们的值:

textLabel

如果你想重新发布textLabel& imageView,你可以创建一个继承自UITableViewCell的子类,并覆盖if (cell == nil) { // ... } cell.textLabel.text = obj.name; cell.imageView.image = obj.image;

-layoutSubviews