Aus der UIStackView-Klassenreferenz
In removeArrangedSubview:
Um zu verhindern, dass die Ansicht nach dem Aufrufen der Methode removeArrangedSubview: des Stapels auf dem Bildschirm angezeigt wird, entfernen Sie die Ansicht explizit aus dem Array subviews, indem Sie die Methode removeFromSuperview der Ansicht aufrufen.
In arrangierter Unteransicht:
Immer wenn die removeFromSuperview-Methode einer angeordneten Ansicht aufgerufen wird, entfernt die Stapelansicht die Ansicht aus ihrem arrangierten Subview-Array
Von diesen scheint es, dass das Aufrufen von removeFromSuperview ausreicht, um eine Unteransicht zu entfernen, und ich habe sie ohne Probleme so verwendet. Ich habe das Verhalten auch bestätigt, indem ich die Anzahl der arrangierten Subviews-Arrays protokolliert habe, wenn removeFromSuperview aufgerufen wird.
Viele Tutorials und Kommentare hier zu S / O sagen jedoch, beide anzurufen. Gibt es einen Grund dafür? Oder machen die Leute das einfach, weil es in der Dokumentation steht?
quelle
removeArrangedSubview
ohne zu wissen , dass ich auch anrufen sollteremoveFromSuperview
, und es hat zwar die Sicht geklärt,arrangedSubviews
aber die Sicht hat immer nochsubviews
alle Arten von verwirrendem Bruch verursacht. Durch Hinzufügen desremoveFromSuperview
Anrufs (sobald ich diese Frage gesehen habe!) Wurde das Problem behoben.removeFromSuperview
. Ich rufe nurremoveFromSuperview
ohne Probleme an.Antworten:
Nein, ruf einfach an
subview.removeFromSuperview()
quelle
removeFromSuperView()
scheint zu funktionieren, kann jedoch zu seltsamen Abstürzen führen, wenn Sie viele Ansichten hinzufügen und entfernen. Wenn Sie den Diskussionsteil der Dokumente lesen, ist es ziemlich klar, dass Sie beide anrufen müssen.removeFromSuperview()
. Ich werde in Kürze ein Update veröffentlichen, das auch hinzufügtremoveArrangedSubview()
und darüber berichtet, ob dies das Problem behebt!In iOS 12.0 müssen Sie verwenden
stackView.arrangedSubviews[index].removeFromSuperview()
Wenn Sie verwenden
removeArrangedSubview
, gibt es einen Fehler, bei dem die Ansicht am angegebenen Index entfernt wurde, die Ansicht, die ich löschen möchte, jedoch unter angezeigt wirdCGPoint(x: 0, y: 0)
.Hoffe das hilft jemandem.
quelle
Hacking With Swift bietet ein ziemlich gutes Beispiel und eine Erklärung, in diesem Fall die Verwendung von Webansichten.
https://www.hackingwithswift.com/read/31/4/removing-views-from-a-uistackview-with-removearrangedsubview
quelle
removeFromSuperview
Sie haben Recht, nur der Anruf bei
removeFromSuperview
reicht aus, um die Ansicht vollständig zu entfernen.Ich vermute, der Grund, warum Leute beide setzen, ist, dass sie auf die
removeArrangedSubview
Dokumentation stoßen, was zu sagen scheint, dass beide benötigt werden. (Und tatsächlich sind sie es, wenn Sie anrufenremoveArrangedSubview
und wollen, dass die Aussicht wirklich weg ist.)Das zusätzliche Dokument
arrangedSubviews
wird von so vielen nicht gesehen, sodass sie nicht erkennenremoveArrangedSubview
, dass es in diesem Fall optional ist.quelle
removeFromSuperview()
wird also nicht empfohlen, nur zu verwenden.Eine angeordnete Unteransicht aus einer Stapelansicht zu entfernen ist
// To remove it from the view hierarchy subView.removeFromSuperview()
quelle
removeFromSuperview()
ist laut Apples Dokumentation ausreichend und man kann sich auch leicht selbst testen.removeArrangedSubview()
ist einfach nicht nötig.Zum Entfernen benutze ich diese Erweiterung. Ich weiß nicht wirklich, ob es notwendig ist, Einschränkungen zu entfernen. Aber vielleicht würde es helfen.
extension UIStackView { func removeAllArrangedSubviews() { let removedSubviews = arrangedSubviews.reduce([]) { (allSubviews, subview) -> [UIView] in self.removeArrangedSubview(subview) return allSubviews + [subview] } for v in removedSubviews { if v.superview != nil { NSLayoutConstraint.deactivate(v.constraints) v.removeFromSuperview() } } } }
quelle
Nein, um eine bestimmte Ansicht zu entfernen.
So entfernen Sie alle Unteransichten
quelle
Ich werde vorschlagen, arrangierte Unteransichten zu bekommen und diese dann wie unten beschrieben zu entfernen.
for view in self.stackView.arrangedSubviews{ self.stackView.removeArrangedSubview(view) view.removeFromSuperview() }
quelle