2010-07-12 7 views
5

Grundsätzlich mag ich alle Objekte aus einem UIScrollView entfernen, und ich habe noch keine Lösung gefunden, weil ein einfaches „removeAllObjects“ Befehl funktioniert nicht. Hat jemand eine Idee, wie es geht?iPhone: Wie alle Objekte aus einem UIScrollView entfernen

+3

Entfernen Sie nicht alle Unteransichten eines 'UISubview'. Die Scrollindikatoransichten sind Unteransichten. Sie werden diese auch entfernen. Ich empfehle, Ihre Inhaltsansichten in Ihrem eigenen Container UIView zu platzieren. (Halten Sie es als einen ivar für einfachen Zugriff während des Hinzufügens und Entfernens von ihm) – ohhorob

Antwort

32

Noch einfacher:

[[scrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 
+0

Ich vermute, Sie das gleiche Problem mit 'makeObjectsPerformSelector' in Bezug auf sie haben Looping durch die Subviews zu entfernen, während das Array gleichzeitig ändern. Dieser Weg ist elegant und wird von vielen benutzt, aber wie adressieren Sie das oben vorgestellte Programm? – iwasrobbed

+0

Ich bin ziemlich sicher makeObjectsPerformSelector: generiert ein temporäres Array vor dem Aufruf der Selektor für jedes Objekt. Wenn es nicht so wäre, wie du sagst, würde es Probleme verursachen. – Kalle

9

Der einfachste Weg:

for(UIView *subview in [scrollView subviews]) { 

    [subview removeFromSuperview]; 

} 
+0

Ist es sicher, den Array-Inhalt zu ändern, während Sie durch die Elemente durchlaufen? Ich frage mich nur ... – progrmr

+0

Im Allgemeinen ist es wahrscheinlich nicht die beste Vorgehensweise, also sollten Sie ein temporäres Array einrichten, das zum Entfernen markiert ist. : P – iwasrobbed

+1

Es ist auf jeden Fall sicher Subviews während Aufzählen Eltern Subviews Sammlung – ohhorob

3

Zwei Lösungen wäre, ohne die Bildlaufleisten zu entfernen:

einen Tag alle Ihre Subviews hinzufügen, entfernen Sie diese mit diesen Tags.

Umsetzung:

Dieses über Ihre Klasse

#define XPScrollViewSubviewStartTag    100 

Wenn fügen Sie die Objekte

for(NSInteger = 0;i<[viewArray count];i++){ 
    UIView* view = [viewArray objectAtIndex:i]; 
    view.tag = XPScrollViewSubviewStartTag + i; 
    [scrollView addSubview:view]; 
} 

Wenn Sie später die Ansichten

verwenden löschen möchten
for(UIView* view in [scrollView subviews]){ 
     if(view.tag >= XPScrollViewSubviewStartTag) 
      [view removeFromSuperview]; 
} 

Erstellen eine benutzerdefinierte UIView Klasse

Wenn Sie die Ansichten

for(id view in [scrollView subviews]){ 
     if(![view isKindOfClass:[CustomView class]]) 
      continue; 

     //not necessary, but just to make things understandable 
     CustomView* customView = (CustomView*)view; 
     [customView removeFromSuperview]; 
} 
1

Oritm Lösung entfernen wollen, ist schön, aber wenn Sie wollen Tags nicht stören, können Sie manuell entfernen, welche Ansichten Sie entfernen möchten der Bildlauf Dies setzt voraus, dass Sie wissen, welche Ansicht entfernt werden soll. Zum Beispiel meine Scroll hat nur UILabels so, wenn ich folgendes ausgeführt:

// This will remove the scrollview but the scrollbars will remain 
for (UIView *subview in [self.detailsExpander.scrollView subviews]) { 
    if ([NSStringFromClass([subview class]) isEqualToString:@"UILabel"]) 
     [subview removeFromSuperview]; 
} 

Dadurch werden alle Etiketten nur entfernen, sondern die Bildlaufleisten halten (die Bildansichten sind). Hinweis: Dies funktioniert nicht, wenn Sie bestimmte Bildansichten beibehalten und gleichzeitig die Bildlaufleisten beibehalten möchten.

Verwandte Themen