2016-07-29 4 views
5

Ich arbeite gerade an einer App, um iOS-Programmierung und Swift zu lernen. Ich habe eine Ansicht, die zwei Hauptuntersichten enthält, eine MKMapView und eine UITableView. Wenn eine bestimmte Annotation in der MapView ausgewählt ist, möchte ich bestimmte Zellen in der TableView ausgeblendet werden. Wenn die Annotation deaktiviert ist, sollten die Zellen erneut angezeigt werden. Zurzeit mache ich das, indem ich die Höhe für die Zellen, die auf 0 versteckt werden sollen und tableView.beginUpdates()tableView.endUpdates() aufrufen, dies verursacht jedoch alle Arten von AutoLayout-Einschränkungen in meinen benutzerdefinierten Zellen zu brechen. Ich habe auch versucht, die versteckte Eigenschaft in der Zelle auf True zu setzen, bevor ich die Höhe auf 0 setze, aber die AutoLayout-Bedingungen werden immer noch gebrochen.So verstecken Sie UITableViewCells, während Sie die AutoLayout-Einschränkungen nicht verletzen

Was wäre der richtige Weg, dies zu tun?

Vielen Dank im Voraus.

+0

Es ist ein guter Weg, zwei verschiedene Arrays als Tabellenansicht Datenquelle zu halten. Die ersten haben alle Ihre Daten, die angezeigt werden können. Die zweite ist die echte Array-Datenquelle der Tabellenansicht. Wenn Sie auf die Anmerkungen klicken, können Sie das zweite Array erneuern (indem Sie die Daten einfügen oder löschen, die angezeigt werden müssen oder nicht), indem Sie die Daten aus dem ersten Array übernehmen. Die Tabellenansicht wird erst am Ende neu geladen. –

+0

So habe ich meinen ViewController zuerst implementiert, aber ich konnte nicht herausfinden, wie ich das Verschwinden von Zellen animieren könnte, wenn das zweite Array aktualisiert wird. Ich bin offen für Vorschläge, wie ich diese Veränderung animieren könnte. –

Antwort

2

Meine 2 Cent setzen: nur versuchen, die Priorität einer der widersprüchlichen Zwänge ein zu senken niedrigerer Wert, wie UILayoutPriorityDefaultHigh (750, falls in Interface Builder verwendet) oder noch niedriger, hängt davon ab, wie Ihre Zelle zusammengesetzt ist. Es sollte ausreichen, um dem Auto-Layout-System einen Hinweis zu geben, welche Einschränkung sicher gebrochen werden kann. Wahrscheinlich möchten Sie die Beschränkung, die den Abstand vom unteren Rand definiert, aufheben.

+0

Es waren tatsächlich die Constrains, die den Abstand vom Boden definierten, der Probleme verursachte. Ich ersetzte es durch eine andere Einschränkung, die zu demselben Layout führt. Vielen Dank! –

1

Implementierung heightForRowAtIndexPath: wie unten. auch müssen Sie die Höhe Einschränkung 0

ObjC Version

-(CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (shouldHideCell) 
     return 0; 
    } 
    else { 
     return UITableViewAutomaticDimension; 
    } 
} 

Swift Version

 override func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat { 
    if shouldHideCell { 
      return 0 
     } else { 
      return UITableViewAutomaticDimension 
     } 
    } 
+0

Ah, ich hätte besser verstehen müssen, welche Einschränkungen kaputt sind. Die Beschränkungen innerhalb der Zelle sind gebrochen, wenn die Höhe auf 0 gesetzt ist. Übrigens sollten Linien in Swift nicht mit einem ';' enden. –

+0

Ich bin kein schneller Entwickler. Jetzt wurde es entfernt. Wenn die Zelle das von der Standard-Höhenbeschränkung aktivierte automatische Layout zur Inhaltsansicht der Zelle hinzugefügt wird. Wenn Sie 'heightForRowAtIndexPath()' nicht implementieren, wird Constraint mit Ihrer 0-Constraint-Ansicht von Unteransicht in Konflikt geraten. – Rajesh

+0

Ich habe das Problem behoben, indem ich eine bestimmte Einschränkung durch eine weniger einschränkende ersetzt habe, die trotzdem funktioniert. Danke für die Hilfe. –

Verwandte Themen