我正在尝试制作一个表格,其中第一个单元格的布局与其余单元格不同。我想把图像作为第一个单元格的背景,即它看起来像这样:
这是我实施的代码
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问题是..当我向下滚动并再次向上滚动时,背景图像开始重复,缩略图也会重叠,如图所示:
如果我再次向上和向下滚动..这是发生的事情:
我可能做了一些愚蠢的错误,但是我无法弄清楚它是什么。请帮忙
答案 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?