swift indexPath.row==0 对 UITableViewCell 的工作很奇怪

swift indexPath.row==0 works weirdly for UITableViewCell

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

这是我的实现代码

 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
}

问题是..当我向下滚动并再次向上滚动时,背景图像开始重复,缩略图也重叠,如图所示:

如果我再次上下滚动..会发生什么:

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

问题是为了提高效率,tableView 正在重用该单元格,但它从未被重置。

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

在 table 视图中单元格被重复使用你应该重置与特定版本不相关的单元格部分您所追求的单元格样式。类似于:

 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 设计,每种都有不同的重用标识符。这样你就不需要关心重置了。

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