2015-06-14 24 views
6

Mam scrollView i dodałem do niego refreshcontroll.Swift usuń subviews z podglądu

self.refreshControl = UIRefreshControl() 
self.refreshControl.attributedTitle = NSAttributedString(string: "Frissítéshez húzzad! :)") 
self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged) 
self.scrollView.addSubview(refreshControl) 

w sposobie odświeżania muszę usunąć wszystkie subviews z Scrollview, następnie zaludnić Scrollview ..

self.refreshControl = UIRefreshControl() 
self.refreshControl.attributedTitle = NSAttributedString(string: "Frissítéshez húzzad! :)") 
self.refreshControl.addTarget(self, action: "refresh:", forControlEvents: UIControlEvents.ValueChanged) 
self.scrollView.addSubview(refreshControl) 

po próbuję wyciągnąć mój Scrollview uzyskać nowe dane, ale to nie już więcej refreshcontroll. Myślę, że to dlatego, że po usunięciu subviews z mojego scrollview również usuwam refreshcontroll z niego. (jeśli ponownie dodaję refreshcontroll w mojej metodzie odświeżania, mój scrollview będzie ponownie odświeżał) Ale jest inny problem. Po orzeźwiający mój Scrollview ruchu w dół .. i dołączone do zdjęć:

ten sposób mogę usunąć subiews:

func refresh(sender:AnyObject) 
{ 
    //remove all subviews from scrollview.. 
    let subViews = self.scrollView.subviews 
    for subview in subViews{ 
     println("for removing...") 
     subview.removeFromSuperview() 
    } 

    println("refresh called..") 
    UIApplication.sharedApplication().applicationIconBadgeNumber = 0 
    //remove all elements from the array 
    tstFrames.removeAll(keepCapacity: false) 
    //refresh data from webservice and adding it to tstFrames Array 
    wsServiceFeedTst() 
    //adding items to the scrollview from tstFramesArray 
    addPosts() 
    self.refreshControl.endRefreshing() 

} 

ten sposób Scrollview wyglądać przed ochłody: enter image description here

to jak to wygląda po odświeżeniu: czy ktoś może mi pomóc, dlaczego to się zmienia?

Dziękujemy!

Dziękuję, to jest rozwiązanie:

let subViews = self.scrollView.subviews 
for subview in subViews{ 
    println("for removing...") 
    if (subview is PostLineItem) { 
     subview.removeFromSuperview() 
    } 
    else { 
     println("not removing..") 
    } 
} 
+0

Czy możesz opublikować kod, którego używasz do usunięcia subviews? –

+0

Pytam, ponieważ możesz usunąć zarówno kontroler odświeżania, jak i ograniczenia układu ... –

+0

dziękuję! sprawdź moje zaktualizowane pytanie .. czy ograniczenia layoutu są również subviewsami? :) – solarenqu

Odpowiedz

14

przez wyprowadzenie wszystkich subviews, można być również usuwanie subviews inne niż te, które jawnie dodanych, takich jak widoku odświeżania i ograniczeń układu.

(I odpowiedzieć na pytanie z uwagami, ograniczenia układu może być w rzeczywistości subviews opiszę jak usunąć wszystkie subviews z wyjątkiem ograniczeń układ tutaj:.. https://stackoverflow.com/a/27281242/2274694)

W ogóle, polecam zmianę kodu do bardziej szczegółowe, tak aby usunięte zostały tylko dodane przez Ciebie widoki. Na przykład, można dodać znacznik do subviews dodawanych w swojej metodzie addPosts:

post.tag = 1000 

następnie usunąć tylko subviews z tego znacznika w refresh::

let subViews = self.scrollView.subviews 
for subview in subViews{ 
    if subview.tag == 1000 { 
     subview.removeFromSuperview() 
    } 
} 

aby upewnić się, że nie usuń wszelkie subskrybcje, które nie zostały samodzielnie dodane.

Edit: Okazuje się, dodane subviews PO są wszystkie niestandardowego typu PostLineItem tak znaczniki są zbędne, ponieważ możemy po prostu usunąć wszystkie PostLineItem S zamiast:

for subview in self.view.subviews { 
    if subview is PostLineItem { 
     subview.removeFromSuperview() 
    } 
} 
+0

niech subviews = self.scrollView.subviews za podrzędny w subviews { println ("do usuwania ...") if (subview jest PostLineItem) { subview.removeFromSuperview() } else { println ("nie usuwanie ...") } } To jest rozwiązanie! :) – solarenqu

+0

@solarenqu Tak, to jeszcze lepiej, ponieważ twoje dodane subviews są podobno typu 'PostLineItem'. –

+0

@LyndseyScott Mogę stworzyć UIView(), która będzie dodawana do Scrollview i wszystkie subviews są dodawane do tej UIView, a potem, gdy chcę usunąć wszystkie subviews, mogę po prostu usunąć ten UIView? –

3

Natknąłem się dzisiaj o tym problemem, jak również i chciałbym udostępnić moje rozwiązanie. Możesz usunąć wszystkie subviews widoku (i ich subviews) z następującym rozszerzeniem UIView w swift. Dodatkowo dołączyłem rozwiązanie do usuwania wszystkich więzów w ten sam sposób.

extension UIView { 

    // Recursive remove subviews and constraints 
    func removeSubviews() { 
    self.subviews.forEach({ 
     if !($0 is UILayoutSupport) { 
      $0.removeSubviews() 
      $0.removeFromSuperview() 
     } 
    }) 

    } 

    // Recursive remove subviews and constraints 
    func removeSubviewsAndConstraints() { 
    self.subviews.forEach({ 
     $0.removeSubviewsAndConstraints() 
     $0.removeConstraints($0.constraints) 
     $0.removeFromSuperview() 
    }) 
    } 

} 

Pierwsze rozwiązanie zachowa wszystkie ograniczenia, zobacz odpowiedź Lyndseys.Należy pamiętać, że to rozwiązanie usuwa całą hierarchię poniżej UIView. Jeśli chcesz tylko usunąć określoną wymianę subviews lub wydłużyć w ten sposób:

if !($0 is UILayoutSupport) && !($0 is PostLineItem)