2010-02-03 12 views
5

jestem programowo dodając kilka UIButtons do mojego widoku. Po kliknięciu jednego z przycisków wszystkie powinny być "removeFromSuperView" lub zwolnione, a nie tylko jeden.usunąć wszystkie UIButton jest z podrzędny

for (int p=0; p<[array count]; p++) { 
    button = [[UIButton alloc] initWithFrame:CGRectMake(100,100,44,44)]; 
    button.tag = p; 
    [button setBackgroundImage:[UIImage imageNamed:@"image.png"] forState:UIControlStateNormal];  
    [self.view addSubview:button];  
    [button addTarget:self action:@selector(action:) forControlEvents:UIControlEventTouchUpInside]; 
} 

Teraz jest to część, w której należy usunąć wszystkie przyciski. Nie tylko jeden.

-(void) action:(id)sender{ 
    UIButton *button = (UIButton *)sender; 
    int pressed = button.tag; 
    [button removeFromSuperview]; 
} 

Mam nadzieję, że ktoś może mi pomóc z tym!

Odpowiedz

2
NSMutableArray *buttonsToRemove = [NSMutableArray array]; 
for (UIView *subview in self.view.subviews) { 
    if ([subview isKindOfClass:[UIButton class]]) { 
     [buttonsToRemove addObject:subview]; 
    } 
} 
[buttonsToRemove makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

EDIT:
Mam edytowane moją odpowiedź do lepszego rozwiązania.
Teraz obiekty nie są usuwane z tablicy podczas wyliczania ...

+0

należy czytać "dla (UIView * podrzędny w self.view.subviews)" Chyba – FelixLam

+0

Thnx Micheal! Po zmianie (UIView * podrzędny w self.view) w: (UIView * podrzędny w subviews self.view []) działa jak czar! – Martijn

+0

@Felix, dziękuję za poprawkę. Masz absolutną rację. Edytowałem swoją odpowiedź. –

8

Bardziej wydajnym sposobem byłoby dodanie każdego przycisku do tablicy podczas jej tworzenia, a następnie po naciśnięciu przycisku wszystkie przyciski w tablicy wywołać metodę -removeFromSuperView tak:

[arrayOfButtons makeObjectsPerformSelector:@selector(removeFromSuperView)]; 

Następnie po tym, można je zachować przycisków na tablicy i ponownie je, lub zadzwoń removeAllObjects mieć je wydała. Następnie możesz zacząć wypełniać go ponownie później.

To pozwala uniknąć konieczności przechodzić przez całą hierarchią Widok patrzy na guziki.

+0

Dobre rozwiązanie ... –

+0

naprawdę czysty pomysł. robiłem to zawsze, z dodatkowym widokiem, a następnie wykonując ten "makeObjectsPerformSelector:" do tego widoku. ale robienie tego za pomocą tablicy jest znacznie lepsze. – choise

8

Inna odpowiedź tylko dla odniesienia:

for (int i = [self.view.subviews count] -1; i>=0; i--) { 
    if ([[self.view.subviews objectAtIndex:i] isKindOfClass:[UIButton class]]) { 
     [[self.view.subviews objectAtIndex:i] removeFromSuperview]; 
    } 
} 
2

także spróbować tego jest bardzo prosta:

for (UIButton *btn in self.view.subviews){  
       [btn removeFromSuperview]; //remove buttons 
    } 
+0

jak St3fan powiedział podczas korzystania szybki wyliczenie nie należy modyfikować zawartość kolekcji użytkownika. – Daniel

Powiązane problemy