在UITableViewCell中使用UITextView进行动态单元重新调整大小会导致警告?

时间:2017-03-28 06:04:36

标签: ios swift uitableview swift3

目前,在我的代码中,我以编程方式在*.domain.com中添加UITextView,并添加了根据用户输入的内容自动调整单元格大小的功能。< / p>

目前看起来像这样:

UITableViewCell

我只关心第1部分,因为这是我想要自动调整单元格高度的唯一单元格。所有其他部分应保持静态单元格高度。

我遇到的问题是,只要我在override func viewDidLoad() { tableView.estimatedRowHeight = 30.0 tableView.rowHeight = UITableViewAutomaticDimension } override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { // Dequeue the cell to load data let cell: UITableViewCell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath) if indexPath.section == 0 { // Code } if indexPath.section == 1 { let textView: UITextView = UITextView() textView.delegate = self textView.textColor = UIColor.black textView.isScrollEnabled = false textView.translatesAutoresizingMaskIntoConstraints = false cell.addSubview(textView) let leadingConstraint = NSLayoutConstraint(item: cell.contentView, attribute: NSLayoutAttribute.leading, relatedBy: NSLayoutRelation.equal, toItem: textView, attribute: NSLayoutAttribute.leading, multiplier: 1.0, constant: 8.0) let trailingConstraint = NSLayoutConstraint(item: cell.contentView, attribute: NSLayoutAttribute.trailing, relatedBy: NSLayoutRelation.equal, toItem: textView, attribute: NSLayoutAttribute.trailing, multiplier: 1.0, constant: -8.0) cell.contentView.addConstraint(leadingConstraint) cell.contentView.addConstraint(trailingConstraint) let topConstraint = NSLayoutConstraint(item: cell.contentView, attribute: NSLayoutAttribute.top, relatedBy: NSLayoutRelation.equal, toItem: textView, attribute: NSLayoutAttribute.top, multiplier: 1.0, constant: 0) let bottomConstraint = NSLayoutConstraint(item: cell.contentView, attribute: NSLayoutAttribute.bottom, relatedBy: NSLayoutRelation.equal, toItem: textView, attribute: NSLayoutAttribute.bottom, multiplier: 1.0, constant: 0) cell.contentView.addConstraint(topConstraint) cell.contentView.addConstraint(bottomConstraint) } else if indexPath.section == 2 { // Code } return cell } override func numberOfSections(in tableView: UITableView) -> Int { return 3 } override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return 1 } override func tableView(_ tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? { let headerCell = tableView.dequeueReusableCell(withIdentifier: "HeaderCell") let titleLabel = headerCell?.viewWithTag(1) as! UILabel if section == 0 { titleLabel.text = "Title" } else if section == 1 { titleLabel.text = "Title" } else if section == 2 { titleLabel.text = "Title" } return headerCell?.contentView } override func tableView(_ tableView: UITableView, viewForFooterInSection section: Int) -> UIView? { let footerCell = tableView.dequeueReusableCell(withIdentifier: "FooterCell") return footerCell } override func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat { if indexPath.section == 1 { return UITableViewAutomaticDimension } return super.tableView(tableView, heightForRowAt: indexPath) } override func tableView(_ tableView: UITableView, heightForHeaderInSection section: Int) -> CGFloat { return 35.0 } override func tableView(_ tableView: UITableView, heightForFooterInSection section: Int) -> CGFloat { return 15.0 } func textViewDidChange(_ textView: UITextView) { tableView.beginUpdates() tableView.endUpdates() } 中第一次按回车键跳到下一行,我就会很快看到一些&#34;鬼&#34;细胞并得到警告说明:

  

没有重复使用表格单元格的索引路径

单元格的高度相应地动态地重新调整自身大小,并且在按下初始返回键之后,任何后续的新行都不会重新生成&#34; ghost&#34;细胞,但我仍然收到警告。

我似乎做错了什么?

由于

3 个答案:

答案 0 :(得分:0)

TextView继承自scrollView,因此textView的内容大小可能大于frame(在这种情况下textView将滚动)。为了让tableView计算单元格的自动大小,它需要具有隐式大小的组件,如label或button。因此,为了让tableView计算textView的隐式大小,您应该禁用滚动。

textView.isScrollEnabled = false

应该允许您的细胞扩展:)

修改

当可重用单元格用作节标题时(例如在您的情况下)看起来会发生这种情况看看:What is the meaning of the "no index path for table cell being reused" message in iOS 6/7?

建议:

创建普通xib添加视图并将其作为节头返回 否则按照上面链接中的答案

答案 1 :(得分:0)

试试这个。 也添加此方法。 func tableView(tableView:UITableView,estimatedHeightForRowAtIndexPath indexPath:NSIndexPath) - &gt; CGFloat的

答案 2 :(得分:0)

func tableView(tableView: UITableView, estimatedHeightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat{
 if(indexPath.row == 0){
  return heightForFirstRow
 }
return heightForStaticCell
}