当单元格被重新使用时,如何正确地从UITableViewCell.contentview中删除子视图


  • 我向每个内容添加子视图每个单元格的视图
  • 每个单元格的子视图不同
  • 我通过设置单元格的标记来识别它
  • 由于单元格可以重复使用,在返回cellForRowAtIndexPath中的单元格之前,我首先删除它的所有子视图

[[cell.contentView子视图]makeObjectsPerformSelector:@selector(removeFromSuperview)];

我的问题是:

  • 执行上述代码时,单元格未正确呈现。详细信息文本被截断
  • 如果不执行上述语句,则detailText可以,但存在错误子视图

那么,当单元格被重新使用时,如何正确地从UITableViewCell.contentview中删除子视图呢??

是否有completionHandlet挂钩?

我应该在后台队列中运行上面的代码并在主队列中呈现单元格吗?这是正确的方法吗

这不是一个非常优雅的解决方案,但您可以标记自定义子视图,然后:用于子视图中的视图。。。如果view.tag==myTag//从superview 中删除

一个更好的解决方案是制作一些表视图单元格子类,重用您的自定义子视图。

我用swift写了一堆代码来模拟你的问题,一切都很好(考虑到子视图的小复杂性):

//
//  ViewController.swift
//  example
//
//  Created by Tiago Maia Lopes on 2/17/15.
//  Copyright (c) 2015 -. All rights reserved.
//
import UIKit
class ViewController: UIViewController {
  @IBOutlet weak var tableView: UITableView!
  override func viewDidLoad() {
super.viewDidLoad()
tableView.rowHeight = 80
  }
}
extension ViewController: UITableViewDataSource {
  func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return 20
  }
}
extension ViewController: UITableViewDelegate {
  func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
var cell = tableView.dequeueReusableCellWithIdentifier("identifier") as? UITableViewCell
if cell == nil {
  cell = UITableViewCell(style: .Subtitle, reuseIdentifier: "identifier")
} else {
  cell?.contentView.subviews.map {
    currentSubview in
    (currentSubview as UIView).removeFromSuperview()
  }
  if indexPath.row % 2 == 0 {
    let otherTitle = UILabel(frame: CGRectMake(10, 50, 150, 30))
    otherTitle.text = "My Title testing"
    cell?.contentView.addSubview(otherTitle)
    let button = UIButton(frame: CGRectMake(170, 30, 100, 40))
    button.backgroundColor = .greenColor()
    cell?.contentView.addSubview(button)
  } else if indexPath.row % 3 == 0 {
    let boxView = UIView(frame: CGRectMake(10, 50, 130, 30))
    boxView.backgroundColor = .blackColor()
    cell?.contentView.addSubview(boxView)
    let otherButton = UIButton(frame: CGRectMake(140, 50, 70, 30))
    otherButton.backgroundColor = .brownColor()
    cell?.contentView.addSubview(otherButton)
  } else {
    let otherTitle = UILabel(frame: CGRectMake(10, 50, 150, 30))
    otherTitle.text = "OTHER TITLE TESTING"
    cell?.contentView.addSubview(otherTitle)
  }
}
println(cell?.subviews.count)
cell?.textLabel?.text = "TESTING"
return cell!
  }
}

我不知道这段代码是否能帮助你把事情做好。我建议您为更复杂的视图相关内容创建一个UITableViewCell子类,比如这个。这个类可以有一些辅助方法(例如addViews和removeViews),并包括一些要在layoutSubviews方法中执行的布局位置代码(当重用单元格时会调用这些方法)。此外,使用AL定位视图并设置标志以确保仅添加一次约束也会很有帮助。关于你的最后一个问题,在后台执行与UI相关的东西不是一个好主意,行为可能很难调试,而且出乎意料。在将GCD与相关UI一起使用时,我们必须小心。

最新更新