2016-07-04 17 views
1

Ich habe eine Zelle in einer Tabellenansicht, die UITextView enthält. UITextview hat eine Beschränkung von top, leading, trailing und bottom auf die Inhaltsansicht von uitableviewcell. Ich möchte die uitableviewcell ausblenden, wenn eine Textansicht leeren Text enthält. Dafür reduziere ich die Zellenhöhe auf 0. Da die Textansicht Einschränkungen in Bezug auf UITableViewCell aufweist.Hide UITableviewcell, die UITextview (Autolayout) enthält

UITableViewCell 
--------------------------- 
|   -T-   | 
| -L- UITextView -R- | 
|_________-B-_____________| 

L, T, B, R - links, oben, unten, rechts Constraints

Ich bin die Zwänge Problem bekommen.

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> 

Wie kann ich die Zelle verstecken, ohne ein Problem mit dem automatischen Layout zu haben.

+0

können Sie die Top ändern und unten Einschränkungen Konstanten auf 0 –

+0

Aber die Zelle ist wiederholbar Inhalt. Wie kann ich die Beschränkung ändern? Könnten Sie mehr erklären? –

+0

Wie stellen Sie die Höhe auf 0, durch Autolayout oder durch heightForRow: atIndexPath? – 7vikram7

Antwort

1

Ich würde die Einschränkungen aus- und wieder einschalten, die active Eigenschaft. Dies ist der einfachste Ansatz, beachten Sie aber, dass es nur auf iOS 8+ funktionieren wird, weil die active Eigenschaft auf NSLayoutConstraint nur in iOS hinzugefügt wurde 8.

zunächst sicher, dass Sie eine IBOutletCollection Array alle Einschränkungen enthält, die Sie benötigen:

@IBOutlet var allConstraints : [NSLayoutConstraint]! 

Sie können sie in Ihrem xib/Storyboard, wenn Sie eine haben anschließen. Ansonsten richte sie einfach in Code ein.

Dann wird in dem Fall, in dem Sie die Zelle verstecken wollen, tun:

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

im Tableview Datenquelle Methode -cellForRowAtIndexPath:.

Auch überschreiben die -prepareForReuse: Methode auf der Unterklasse Zelle wie folgt:

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

Dies schaltet die Einschränkungen zurück, so die Dinge richtig verhalten, wenn eine versteckte Zelle eine nicht versteckte Zelle zu erzeugen wiederverwendet wird.

Sie können auch Anrufe setNeedsLayout und layoutIfNeeded hinzufügen müssen, aber ich würde ohne sie versuchen, mit zu beginnen - hoffentlich das Layout in der reloadData der Tabelle ausgelöst Pass Ansicht soll die Dinge für Sie kümmern - es ist immer am besten, nicht zu Rufen Sie diese Funktionen auf, wenn Sie dies nicht benötigen.

0

Sie können den Wert der Zeichenfolge in einer globalen Variablen speichern. Dann können Sie im cellForRowAtIndexPath überprüfen, ob var null ist, andernfalls können Sie die Zelle zurückgeben.

So:

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

Danke für Ihren Vorschlag. Aber ich ziehe es vor, dies automatisch zu tun. Könntest du mir beim automatischen Layout helfen? –

0

Versuchen Sie, die Beziehung der Abhängigkeiten zu ändern. Statt gleich Verwendung weniger oder gleich

Contraints Settings

Verwandte Themen