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
risposta
Ancora più facile:
[[scrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
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
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
Il modo più semplice:
for(UIView *subview in [scrollView subviews]) {
[subview removeFromSuperview];
}
È sicuro modificare il contenuto dell'array mentre fai il looping degli elementi? Mi stavo solo chiedendo ... – progrmr
In generale probabilmente non è la procedura migliore, quindi potresti voler impostare un array temporaneo contrassegnato per la rimozione. : P – iwasrobbed
È sicuramente sicuro rimuovere le sottoview mentre si enumera la collezione di sottoview del genitore – ohhorob
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];
}
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.
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