隐藏包含UITextview(Autolayout)的UITableviewcell

时间:2016-07-04 14:58:54

标签: ios uitableview autolayout nslayoutconstraint

我在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>

如何在不出现自动布局问题的情况下隐藏单元格。

3 个答案:

答案 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 }
}

这会重新启用约束,因此如果重复使用隐藏单元格来创建非隐藏单元格,则行为正确。

您可能还需要添加对setNeedsLayoutlayoutIfNeeded的来电,但我会在没有它们的情况下尝试开始 - 希望在表格视图中触发布局传递{{ {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)

尝试更改约束的关系。而不是等于使用更少或相等

Contraints Settings