2010-11-09 11 views
11

Saluti tutti,xcode Rimozione di alcune sottoview dalla vista

Sono un noob e ho cercato di lavorare su questo per alcuni giorni.

Sto aggiungendo immagini a una vista tramite UItouch. La vista contiene uno sfondo in cima al quale vengono aggiunte le nuove immagini. Come faccio a cancellare le immagini che aggiungo dalla sottoview, senza eliminare la UIImage che è lo sfondo. Qualsiasi assistenza è molto apprezzata. Grazie in anticipo.

ecco il codice:

- (void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *) event { 
NSUInteger numTaps = [[touches anyObject] tapCount]; 

if (numTaps==2) { 
    imageCounter.text [email protected]"two taps registered";  

//__ remove images 
    UIView* subview; 
    while ((subview = [[self.view subviews] lastObject]) != nil) 
     [subview removeFromSuperview]; 

    return; 

}else { 

    UITouch *touch = [touches anyObject]; 
    CGPoint touchPoint = [touch locationInView:self.view]; 
    CGRect myImageRect = CGRectMake((touchPoint.x -40), (touchPoint.y -45), 80.0f, 90.0f); 
    UIImageView *myImage = [[UIImageView alloc] initWithFrame:myImageRect]; 

    [myImage setImage:[UIImage imageNamed:@"pg6_dog_button.png"]]; 
    myImage.opaque = YES; // explicitly opaque for performance 


    [self.view addSubview:myImage]; 
    [myImage release]; 

    [imagesArray addObject:myImage]; 

    NSNumber *arrayCount =[self.view.subviews count]; 
    viewArrayCount.text =[NSString stringWithFormat:@"%d",arrayCount]; 
    imageCount=imageCount++; 
    imageCounter.text =[NSString stringWithFormat:@"%d",imageCount]; 

} 

}

risposta

28

Quello che vi serve è un modo di distinguere i aggiunti UIImageView oggetti dallo sfondo UIImageView. Ci sono due modi in cui posso pensare di farlo.

Approccio 1: Assign aggiunto UIImageView oggetti un valore speciale tag

Ogni oggetto UIView ha una proprietà tag che è semplicemente un valore intero che può essere utilizzato per identificare quella vista. È possibile impostare il valore della variabile di ciascuna vista aggiunto a 7 in questo modo:

myImage.tag = 7; 

Quindi, per rimuovere i punti di vista aggiunto, potreste fare un passo attraverso tutte le subviews e rimuovere solo quelli con un valore di tag di 7:

for (UIView *subview in [self.view subviews]) { 
    if (subview.tag == 7) { 
     [subview removeFromSuperview]; 
    } 
} 

approccio 2: Ricordati background vista

un altro approccio è quello di mantenere un riferimento alla vista di fondo in modo da poter distinguerlo dalle viste aggiunti. Creare uno IBOutlet per lo sfondo UIImageView e assegnarlo come al solito in Interface Builder. Quindi, prima di rimuovere una sottoview, assicurati che non sia la vista di sfondo.

for (UIView *subview in [self.view subviews]) { 
    if (subview != self.backgroundImageView) { 
     [subview removeFromSuperview]; 
    } 
} 
+2

Risposta 1 è generalmente corretto, ma noti che è possibile restringere la ricerca utilizzando [UIView viewWithTag: 7] e non dover scorrere tutte le singole viste. Naturalmente, questo potrebbe non salvarti nulla, ma è una cosa bella sapere – justin

+0

Ragazzi, grazie mille per il vostro contributo. Ci proverò oggi. Ho fatto un lungo lavoro attorno al quale era necessario aggiungere lo sfondo dopo che tutto era stato cancellato. Non esattamente elegante ma ha funzionato .. –

+1

La tua soluzione è molto intelligente, anche se potrebbe non funzionare così bene quando hai bisogno di un maggiore controllo sulle tue visualizzazioni. Se provi ad usare 'viewWithTag:', come suggerito da @justin, tieni presente che restituirà solo la prima vista trovata con un tag corrispondente. È un metodo molto conveniente quando c'è una sola vista di questo tipo. Se hai molte visualizzazioni con tag corrispondenti, finirai con il iterare per trovarli tutti. Suggerimento extra: le viste hanno un valore di tag predefinito pari a zero, quindi evita di utilizzare zero come valore di tag identificativo. –

0

un codice più rapidamente per l'approccio # 1 in una sola tratta funzionale di codice:

self.view.subviews.filter({$0.tag == 7}).forEach({$0.removeFromSuperview()}) 
Problemi correlati