我在tableview中有一个包含UITextView的单元格。 UITextview具有uitableviewcell内容视图的top,leading,trailing和bottom的约束。如果textview包含空文本,我想隐藏uitableviewcell。为此,我将单元格高度减少到0.因为textview具有相对于UITableViewCell的约束设置。
UITableViewCell
---------------------------
| -T- |
| -L- UITextView -R- |
|_________-B-_____________|
L,T,B,R - 左,上,下,右约束
我遇到了约束问题。
Unable to simultaneously satisfy constraints.
Probably at least one of the constraints in the following list is one you don't want.
Try this:
(1) look at each constraint and try to figure out which you don't expect;
(2) find the code that added the unwanted constraint or constraints and fix it.
(
"<NSLayoutConstraint:0x7fe5d58753a0 UITableViewCellContentView:0x7fe5d5874fe0.bottomMargin == UITextView:0x7fe5d399c000.bottom>",
"<NSLayoutConstraint:0x7fe5d58753f0 UITableViewCellContentView:0x7fe5d5874fe0.topMargin == UITextView:0x7fe5d399c000.top>",
"<NSLayoutConstraint:0x7fe5d5888a20 'UIView-Encapsulated-Layout-Height' V:[UITableViewCellContentView:0x7fe5d5874fe0(0.5)]>"
)
Will attempt to recover by breaking constraint
<NSLayoutConstraint:0x7fe5d58753a0 UITableViewCellContentView:0x7fe5d5874fe0.bottomMargin == UITextView:0x7fe5d399c000.bottom>
如何在不出现自动布局问题的情况下隐藏单元格。
答案 0 :(得分:1)
我会使用active
属性关闭和打开约束。这是最简单的方法,但请注意,它仅适用于iOS 8+,因为active
上的NSLayoutConstraint
属性仅在iOS 8中添加。
首先确保您拥有一个包含所需约束的IBOutletCollection
数组:
@IBOutlet var allConstraints : [NSLayoutConstraint]!
如果您有xib / storyboard,可以将它们连接起来。否则只需在代码中设置它们。
然后,在您要隐藏单元格的情况下,请执行以下操作:
cell.allConstraints.forEach { $0.active = false }
tableview数据源方法-cellForRowAtIndexPath:
中的。
另外,覆盖单元子类的-prepareForReuse:
方法,如下所示:
override func prepareForReuse() {
super.prepareForReuse()
allConstraints.forEach { $0.active = true }
}
这会重新启用约束,因此如果重复使用隐藏单元格来创建非隐藏单元格,则行为正确。
您可能还需要添加对setNeedsLayout
和layoutIfNeeded
的来电,但我会在没有它们的情况下尝试开始 - 希望在表格视图中触发布局传递{{ {1}}应该为您照顾好事情 - 如果您不需要,最好不要将这些功能称为。
答案 1 :(得分:0)
您可以将字符串的值保存在全局变量中,然后在cellForRowAtIndexPath中检查var是否为null,否则可以返回单元格。
像这样:
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell
{
if (your global var != nil) {
let cell: MyCell? = tableView.dequeueReusableCellWithIdentifier("myCell", forIndexPath: indexPath) as? MyCell
cell?.label.text = your value
return cell!
}
}
答案 2 :(得分:0)