Szukam prostej metody usuwania naraz wszystkich podglądów podrzędnych z superwizji zamiast usuwania ich jeden po drugim.
//I'm trying something like this, but is not working
let theSubviews : Array = container_view.subviews
for (view : NSView) in theSubviews {
view.removeFromSuperview(container_view)
}
Czego mi brakuje?
AKTUALIZACJA
Moja aplikacja ma plik main container_view
. Muszę dodać różne inne widoki jako podglądy container_view
, aby zapewnić rodzaj nawigacji.
Tak więc, kiedy klikam przycisk „otwierania” określonej strony, muszę usunąć wszystkie podglądy i dodać nową.
UPDATE 2 - Działające rozwiązanie (OS X)
Chyba Apple to naprawiło.
Teraz jest to łatwiejsze niż kiedykolwiek, wystarczy zadzwonić:
for view in containerView.subviews{
view.removeFromSuperview()
}
Odpowiedzi:
EDYCJA: (dzięki Jeremiah / Rollo)
Zdecydowanie najlepszym sposobem na zrobienie tego w Swift na iOS jest:
^^ Te funkcje są fajne!
//// KONIEC EDYCJI
Po prostu zrób to:
Lub jeśli szukasz konkretnej klasy
źródło
result of call to 'map' is unused
nie jest błędem.Array.map
w większości języków zwróci zmodyfikowaną tablicę. Równoważną metodą, która nie zwraca tablicy, byłabyview.subviews.forEach
.for view:CustomViewClass! in self.view.subviews where view.isKindOfClass(CustomViewClass) { view.doClassThing() }
W przypadku iOS / Swift, aby pozbyć się wszystkich podglądów podrzędnych, których używam:
aby pozbyć się wszystkich podglądów podrzędnych danej klasy (np. UILabel), używam:
źródło
Kod można napisać prościej w następujący sposób.
źródło
To powinno być najprostsze rozwiązanie.
(zobacz Usunąć wszystkie podglądy? aby zapoznać się z innymi metodami)
Zwróć uwagę, że jest to pytanie dotyczące systemu MacOS, a ta odpowiedź działa tylko w przypadku systemu MacOS . Nie działa na iOS.
źródło
NSView
(OS X) iUIView
(iOS).NSView
, a nie iOS iUIView
. Tylko ludziom nie zależy na czytaniu pytania i tagów, dlatego zostało wypełnione odpowiedziami na iOS.Nie wiem, czy udało ci się to rozwiązać, ale ostatnio miałem podobny problem, w którym pętla For za każdym razem pozostawiała jeden widok. Okazało się, że dzieje się tak, ponieważ self.subviews zostało zmutowane (być może) podczas wywołania removeFromSuperview ().
Aby to naprawić, zrobiłem:
Wykonując .copy (), mogłem usunąć każdy podwidok, jednocześnie modyfikując tablicę self.subviews. Dzieje się tak, ponieważ skopiowana tablica (subViews) zawiera wszystkie odniesienia do obiektów i nie jest zmieniona.
EDYCJA: W twoim przypadku myślę, że użyłbyś:
źródło
let subViewsArray: Array = (parentView.subviews as NSArray).copy() as Array<NSView>
Spróbuj tego:
źródło
Rozszerzenie do usuwania wszystkich podglądów podrzędnych, jest szybko usuwane.
źródło
Spróbuj tego:
AKTUALIZACJA : Jeśli masz ochotę na przygodę, możesz rozszerzyć UIView, jak pokazano poniżej:
I nazwij to tak:
źródło
W xcodebeta6 to się udało.
źródło
Napisałem to rozszerzenie:
Aby można było używać self.view.lf_removeAllSubviews w UIViewController. Umieszczę to w szybkiej wersji mojego https://github.com/superarts/LFramework później, kiedy będę miał większe doświadczenie w swift (jak dotąd 1 dzień expa i tak, dla API zrezygnowałem z podkreślenia).
źródło
Szybki 3
Jeśli dodasz tag do widoku, możesz usunąć określony widok.
źródło
view.subviews.filter({$0.tag != 321}).forEach({$0.removeFromSuperview()})
?Szybki 5
Tworzę 2 różne metody usuwania widoku podrzędnego. I jest dużo łatwiejszy w użyciu, jeśli je umieścimy
extension
źródło
Twoja składnia jest nieco nieprawidłowa. Upewnij się, że przesyłasz jawnie.
źródło
musisz tego spróbować
źródło
Do usuwania tylko podglądów podrzędnych określonej klasy - był to jedyny kod Swift, który działał dla mnie w Xcode6.1.1. Zakładając, że jedyne widoki podrzędne, które chcesz usunąć, są typu UIButton ...
źródło
Jedna linijka:
Myślę, że to podejście jest bardziej czytelne niż „ jednoliniowe ” przy użyciu map lub forEach . Skrócona ręka foreach i mapa może być trudna do zrozumienia, ponieważ logika jest bardziej abstrakcyjna.
źródło
Dla Swift 3
Zrobiłem co następuje, ponieważ samo usunięcie z superview nie spowodowało usunięcia przycisków z tablicy.
źródło
Wypróbuj to, przetestowałem to:
źródło
Dla
Swift 4.+
Mam nadzieję, że to jest dla ciebie pełne.
źródło
czy próbowałeś czegoś takiego
źródło