swift indexPath.row == 0很适合UITableViewCell

时间:2015-02-18 08:39:23

标签: ios uitableview swift nsindexpath uitableviewrowaction

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

enter image description here

这是我实施的代码

 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问题是..当我向下滚动并再次向上滚动时,背景图像开始重复,缩略图也会重叠,如图所示: enter image description here

如果我再次向上和向下滚动..这是发生的事情: enter image description here

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

3 个答案:

答案 0 :(得分:3)

问题在于,为了提高效率,tableView正在重用该单元格,但它永远不会被重置。

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

答案 1 :(得分: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设计,每种细胞类型具有不同的重用标识符。这样您就不必关心重置了。

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

答案 2 :(得分:-1)

也许你可以使用tableHeaderView来做到这一点? 或者,如果你想要这样的很多部分,你可以使用

func headerViewForSection(_ section: Int) -> UITableViewHeaderFooterView?