1

我正在尝试制作一个表格,其中第一个单元格的布局与其他单元格的布局不同。我想将图像作为第一个单元格的背景,即它看起来像这样:

在此处输入图像描述

这是我的实现代码

 func imageCellAtIndexPath(indexPath:NSIndexPath) -> MainTableViewCell {
    let cell = self.tableView.dequeueReusableCellWithIdentifier(imageCellIdentifier) as MainTableViewCell
    let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject

    let eTitle:NSString = object.valueForKey("title")!.description
    let deTitle  = eTitle.stringByDecodingHTMLEntities()
cell.artTitle.text = deTitle


    var full_url = object.valueForKey("thumbnailURL")!.description
    var url = NSURL(string: full_url)
    var image: UIImage?
    var request: NSURLRequest = NSURLRequest(URL: url!)
    NSURLConnection.sendAsynchronousRequest(request, queue: NSOperationQueue.mainQueue(), completionHandler: {(response: NSURLResponse!, data: NSData!, error: NSError!) -> Void in

        image = UIImage(data: data)
        if((indexPath.row)==0)  {
        var imageView = UIImageView(frame: CGRectMake(10, 10, cell.frame.width - 10, cell.frame.height - 10))
        imageView.image = image
       cell.backgroundView = UIView()
      cell.backgroundView?.addSubview(imageView)

        }
        else{
        cell.thumb.image = image
        }
    })

    return cell
}

bt问题是..当我向下滚动并再次向上滚动时,背景图像开始重复并且缩略图也重叠,如图所示: 在此处输入图像描述

如果我再次上下滚动..这就是发生的事情: 在此处输入图像描述

我可能犯了一些愚蠢的错误 bt m 无法弄清楚它是什么。请帮忙

4

2 回答 2

3

问题是单元格被 tableView 重用以提高效率,但它从未被重置。

如果单元格不在 indexPath 0 处,则需要从背景视图中清除/删除 imageView。

于 2015-02-18T08:44:17.780 回答
3

在表格视图中,单元格被重用您应该重置与您所追求的单元格样式的特定版本无关的单元格部分。就像是:

 if((indexPath.row)==0)  {
      let frame = CGRectMake(10, 10, 
                             cell.frame.width - 10, cell.frame.height - 10)
      var imageView = UIImageView(frame: frame)
      imageView.image = image
      cell.backgroundView = UIView()
      cell.backgroundView?.addSubview(imageView)

      // Reset 
      cell.thumb.image = nil
 } else{
      cell.thumb.image = image
      // Reset 
      cell.backgroundView = nil
 }

更好和更惯用的想法是UITableViewCell对这两种细胞类型使用单独的设计,每种都有不同的重用标识符。这样你就不需要关心重置了。

PS您应该使用dequeueReusableCellWithIdentifier:forIndexPath:而不是旧的dequeueReusableCellWithIdentifier:,因为它保证返回一个单元格。

于 2015-02-18T08:50:04.957 回答