使用自我调整大小的单元格后,reloadData 不再起作用

Posted

技术标签:

【中文标题】使用自我调整大小的单元格后,reloadData 不再起作用【英文标题】:After using self sizing cells reloadData doesn't work anymore 【发布时间】:2015-04-23 02:54:40 【问题描述】:

我有一个带有自定义单元格的 UITableView。单元格中有一个按钮,一个标签和一个隐藏标签。我希望在单击按钮后隐藏标签可见。但是当我使用自我调整大小的单元格时,在将隐藏标签设置为可见后,我无法重新加载我的 tableView。

使用 viewDidLoad() 函数中的这两行代码,自动调整大小的单元格可以正常工作。

self.tableView.estimatedRowHeight = 68.0
self.tableView.rowHeight = UITableViewAutomaticDimension

这是我的 ViewController 类:

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate 

@IBOutlet weak var tableView: UITableView!
override func viewDidLoad() 
    super.viewDidLoad()

    //Self sizing cells
    self.tableView.estimatedRowHeight = 68.0
    self.tableView.rowHeight = UITableViewAutomaticDimension


override func didReceiveMemoryWarning() 
    super.didReceiveMemoryWarning()
    // Dispose of any resources that can be recreated.


func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int 
    return 1


func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell 
    var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell
    cell.leftLabel.text = "Left Label"
    cell.centerLabel.text = "I am the center label and I need a little more words because I am supposed to be a wrap content. I hope this is enough"
    cell.button.tag = indexPath.row
    cell.button.addTarget(self, action: "buttonAction:", forControlEvents: UIControlEvents.TouchUpInside)
    return cell


func buttonAction(sender: AnyObject) 
    var button: UIButton = sender as! UIButton
    let indexPath: NSIndexPath = NSIndexPath(forRow: button.tag, inSection: 0)
    var cell = tableView.dequeueReusableCellWithIdentifier("cell", forIndexPath: indexPath) as! CustomCell
    cell.centerLabel.hidden = false
    self.tableView.reloadData()


我一打电话

self.tableView.estimatedRowHeight = 68.0

buttonAction 函数中的 reloadData 调用不再起作用。

谁能帮我解决这个问题? 谢谢!

【问题讨论】:

点击按钮后为什么要重新加载tableView数据? 因为如果我不重新加载 tableView,ui 不会更新。如果我删除这一行:self.tableView.estimatedRowHeight = 68.0,按钮操作和重新加载工作正常。但单元格没有从其内容中获取高度。 【参考方案1】:

试试这个。您使用 cellForRowAtIndexPath 来抓取 tableView 中该位置的单元格,而不是 dequeueReusableCellWithIdentifier

func buttonAction(sender: UIButton) 
    var indexPath:NSIndexPath = NSIndexPath(forRow:sender.tag, inSection: 0)
    var cell = tableView.cellForRowAtIndexPath(indexPath) as! CustomCell
    cell.centerLabel.hidden = false

如果你想在你的单元格被重用时隐藏 centerLabel,在你的 CustomCell 类中添加这个方法

override func prepareForReuse() 
    self.centerLabel.hidden = true

【讨论】:

另外,如果您想调整单元格大小,请确保您的自动布局约束是正确的。特别是,标签需要固定在单元格的底部。标签还应包含 0 行,以便它们可以自行调整大小。 ...只是需要考虑的事情【参考方案2】:

reloadData 后,你的 cell.centerLabel.hidden 也会失效。 由于您不更改 cellForXXX 中的 centerLable.hidden,因此 centerLable-hidden 单元格将位于表格中的任何位置。

【讨论】:

但如果我删除这一行:self.tableView.estimatedRowHeight = 68.0,按钮操作和重新加载工作正常。但单元格没有从其内容中获取高度。

以上是关于使用自我调整大小的单元格后,reloadData 不再起作用的主要内容,如果未能解决你的问题,请参考以下文章

UITableView, reloadData 重新加载单元格但不调整表格大小

调用 reloadData() 后自行调整动态 UICollectionViewCell 高度的大小不正确

UICollectionView中删除一个单元格后刷新单元格布局

excel合并单元格后怎么边框线没了?

具有自我调整大小的单元格的集合视图不再可水平滚动

UILabel preferredMaxLayout 打破了自我调整大小的单元格