2016-07-04 2 views
1

У меня есть ячейка в виде таблицы, которая содержит UITextView. UITextview имеет ограничения верхнего, ведущего, конечного и нижнего уровня для представления содержимого uitableviewcell. Я хочу скрыть uitableviewcell, если текст содержит пустой текст. Для этого я уменьшаю высоту ячейки до 0. Так как textview имеет ограничение, установленное относительно UITableViewCell.Скрыть UITableviewcell, который содержит UITextview (Autolayout)

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

Вы можете изменить верхнее и нижнее ограничения константы 0 –

+0

Но клетка повторим содержание. Как я могу изменить ограничение? Не могли бы вы объяснить больше –

+0

Как вы устанавливаете высоту в 0, путем автоопределения или heightForRow: atIndexPath? – 7vikram7

ответ

1

Я бы включить ограничения и выключения с помощью active собственности. Это самый простой подход, но учтите, что она будет работать только на IOS 8+, потому что active собственность на NSLayoutConstraint была добавлена ​​только в прошивке 8.

Сначала убедитесь, что у вас есть IBOutletCollection массива, содержащий все ограничения, нужно:

@IBOutlet var allConstraints : [NSLayoutConstraint]! 

Вы можете подключить их к вашему xib/раскадровке, если он у вас есть. В противном случае просто установите их в коде.

Тогда, в случае, когда вы хотите, чтобы скрыть клетку, сделать:

cell.allConstraints.forEach { $0.active = false } 

в методе источника данных Tableview -cellForRowAtIndexPath:.

Кроме того, переопределить метод -prepareForReuse: на сотовом подкласса следующим образом:

override func prepareForReuse() { 
    super.prepareForReuse() 
    allConstraints.forEach { $0.active = true } 
} 

Это превращает ограничения обратно, так что все правильно вести себя, если скрытая ячейка повторно создать не-скрытые ячейки.

Вам также может понадобиться добавить вызовы setNeedsLayout и layoutIfNeeded, но я хотел бы попробовать без них, чтобы начать с - мы надеюсь, макет пропуск срабатывает в виде таблицы reloadData должны заботиться о вещах для вас - это всегда лучше, чтобы не вызовите эти функции, если вам это не нужно.

0

Вы можете сохранить значение строки в глобальной переменной, а затем в cellForRowAtIndexPath вы можете проверить, является ли var нулевым, если вы не можете вернуть ячейку.

Как это:

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! 
    } 

} 
+0

Спасибо за ваше предложение. Но я предпочитаю делать это автоматически. Не могли бы вы помочь мне в автозапуске –

0

Попробуйте изменить отношение ограничений. Вместо того, чтобы равное использование меньше или равно

Contraints Settings

Смежные вопросы