2010-07-12 5 views
5

Fondamentalmente voglio rimuovere tutti gli oggetti da un UIScrollView e non ho ancora trovato una soluzione perché un semplice comando "removeAllObjects" non funziona. Qualcuno ha un'idea di come si fa?iPhone: come rimuovere tutti gli oggetti da un UIScrollView

+3

Non rimuovere tutte le sottoview di un 'UISubview'. Le visualizzazioni degli indicatori di scorrimento sono sottoview. Rimuoverai anche quelli. Ti consiglio di posizionare le tue visualizzazioni di contenuti nel tuo contenitore UIView. (mantienilo come un ivar per un facile accesso mentre aggiungi e rimuovi da esso) – ohhorob

risposta

32

Ancora più facile:

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

Suppongo che si abbia lo stesso problema con 'makeObjectsPerformSelector' in riferimento ad esso durante il looping delle sottoview mentre si modifica l'array contemporaneamente. in questo modo è elegante e utilizzato da molti, ma come affrontare ciò che è stato presentato sopra? – iwasrobbed

+0

Sono abbastanza sicuro makeObjectsPerformSelector: genera un array temporaneo prima di chiamare il selettore su ciascun oggetto. Se così non fosse, come dici tu, causerebbe problemi. – Kalle

9

Il modo più semplice:

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

    [subview removeFromSuperview]; 

} 
+0

È sicuro modificare il contenuto dell'array mentre fai il looping degli elementi? Mi stavo solo chiedendo ... – progrmr

+0

In generale probabilmente non è la procedura migliore, quindi potresti voler impostare un array temporaneo contrassegnato per la rimozione. : P – iwasrobbed

+1

È sicuramente sicuro rimuovere le sottoview mentre si enumera la collezione di sottoview del genitore – ohhorob

3

Due soluzioni sarebbero, senza rimuovere le barre di scorrimento:

Aggiungi un tag a tutti i tuoi subviews, rimuoverli usando quei tag.

Implementazione:

posto questo sopra la vostra classe

#define XPScrollViewSubviewStartTag    100 

Quando si aggiungono gli oggetti

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

Quando in seguito desidera eliminare i punti di vista usano

for(UIView* view in [scrollView subviews]){ 
     if(view.tag >= XPScrollViewSubviewStartTag) 
      [view removeFromSuperview]; 
} 

Creare un UIView personalizzato classe

Quando si desidera rimuovere i punti di vista

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

soluzione Oritm è bello, ma se non si vuole perdere tempo con i tag, è possibile rimuovere manualmente che considera che si desidera rimuovere dal la scrollview. Questo presumerà che tu sappia quale vista rimuovere. Ad esempio, il mio ScrollView ha solo UILabels così quando ho eseguito il seguente:

// 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]; 
} 

Questo eliminerà solo tutte le etichette, ma mantenere le barre di scorrimento (che sono viste immagini). Nota: questo non funzionerà se si desidera mantenere specifiche visualizzazioni di immagini e allo stesso tempo si desidera mantenere le barre di scorrimento.