2010-11-09 10 views
11

Pozdrawiam wszystkich,xcode Usuwanie niektórych subviews z widoku

Jestem noobem i staram się to przezwyciężyć przez kilka dni.

Dodaję obrazy do widoku za pomocą UItouch. Widok zawiera tło, na którym dodawane są nowe obrazy. Jak wyczyścić obrazy, które dodaję z podglądu, bez pozbycia się UIImage, która jest tłem. Każda pomoc jest bardzo doceniana. Z góry dziękuję.

oto kod:

- (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]; 

} 

}

Odpowiedz

28

Co potrzebne jest sposobem na odróżnienie dodanych UIImageView obiektów z tła UIImageView. Są dwa sposoby na zrobienie tego.

Sposób 1: Rola dodano UIImageView obiektów szczególną wartość znacznika

UIView Każdy obiekt ma tag właściwość, która jest po prostu liczbą całkowitą, które mogą być wykorzystane do identyfikacji tego widoku. Można ustawić wartość znacznika każdego dodany do 7 tak:

myImage.tag = 7; 

Następnie, aby usunąć dodane widoki, można przejść przez wszystkie subviews i usunąć tylko te, o wartości znacznika 7:

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

podejście 2: zapamiętaj tle widok

Innym podejściem jest, aby zachować odniesienie do widoku tła, dzięki czemu można odróżnić go od dodawanych widokami. Utwórz IBOutlet dla tła UIImageView i przypisz go w zwykły sposób w programie Interface Builder. Następnie przed usunięciem subview upewnij się, że nie jest to widok w tle.

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

Odpowiedź 1 jest ogólnie poprawne, ale zauważ, że można ograniczyć wyszukiwanie za pomocą [UIView viewWithTag: 7] nie trzeba powtarzać przez każdy widok. Oczywiście, to może cię nie uratować, ale dobrze jest wiedzieć, – justin

+0

Wielkie dzięki dla twojego wkładu. Wypróbuję je dzisiaj. Zrobiłem długą pracę, która polegała na dodaniu zaplecza po tym, jak wszystko zostało oczyszczone. Niezupełnie elegancki, ale zadziałało. –

+1

Twoje obejście jest bardzo sprytne, ale może nie działać tak dobrze, gdy potrzebujesz większej kontroli nad swoimi widokami. Jeśli spróbujesz użyć 'viewWithTag:', jak zasugerował @justin, pamiętaj, że zwróci on tylko pierwszy widok znaleziony z pasującym tagiem. Jest to bardzo wygodna metoda, gdy istnieje tylko jeden taki widok. Jeśli masz wiele widoków z pasującymi tagami, skończy się iteracją, aby je wszystkie znaleźć. Dodatkowa wskazówka: Widoki mają domyślną wartość znacznika równą zero, więc unikaj używania zera jako wartości znacznika identyfikującego. –

0

Kod szybciej dla podejścia nr 1 tylko w jednym funkcjonalnym wiersza kodu:

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