2009-08-21 16 views
32

Jak mogę usunąć wszystkie subviews z mojego Scrollview ...Jak usunąć subviews z przewijania?

Mam UIView i przycisk nad nim w coś Scrollview jak ta ....

tutaj jest mój kod, aby dodać podrzędny w zwoju widok

-(void)AddOneButton:(NSInteger)myButtonTag { 
lastButtonNumber = lastButtonNumber + 1; 

if ((lastButtonNumber == 1) || ((lastButtonNumber%2) == 1)) { 
btnLeft = 8;} 
else if ((lastButtonNumber == 2) || ((lastButtonNumber%2) == 0)) { 
btnLeft = 162; 
} 
CGRect frame1 = CGRectMake(btnLeft, btnTop, 150, 150); 
CGRect frame2 = CGRectMake(btnLeft, btnTop, 150, 150); 
UIButton *Button = [UIButton buttonWithType:UIButtonTypeCustom]; 
Button.frame = frame1; 
Button.tag = myButtonTag; 
[Button addTarget:self action:@selector(buttonClick:) forControlEvents:UIControlEventTouchUpInside]; 
[Button setBackgroundColor:[UIColor clearColor]]; 
[Button setBackgroundImage:[UIImage imageNamed:@"WaitScreen.png"] forState:UIControlStateHighlighted]; 

    GraphThumbViewControllerobj = [[GraphThumbViewController alloc] initWithPageNumber:[[GraphIdArray objectAtIndex:myButtonTag]intValue]]; 
    GraphThumbViewControllerobj.view.frame=frame2; 
    GraphThumbViewControllerobj.lblCounter.text=[NSString stringWithFormat:@"%d of %d",myButtonTag+1,flashCardsId.count]; 
    GraphThumbViewControllerobj.lblQuestion.text=[flashCardText objectAtIndex:myButtonTag]; 
    [myScrollView addSubview:GraphThumbViewControllerobj.view]; 


[myScrollView addSubview:Button]; 


if ((lastButtonNumber == 2) || ((lastButtonNumber%2) == 0)) { 
btnTop = btnTop + 162; 
} 
if (btnTop+150 > myScrollView.frame.size.height) { 
myScrollView.contentSize = CGSizeMake((myScrollView.frame.size.width), (btnTop+160));} 
} 

i tutaj jest kod, aby usunąć subviews

if(myScrollView!=nil) 
{ 
     while ([myScrollView.subviews count] > 0) { 
      //NSLog(@"subviews Count=%d",[[myScrollView subviews]count]); 
      [[[myScrollView subviews] objectAtIndex:0] removeFromSuperview]; 
} 

alt text http://www.freeimagehosting.net/uploads/e5339a1f51.png

Odpowiedz

102

Aby usunąć wszystkie subviews z dowolnego widoku można iteracyjne nad subviews i wysłać każdy z removeFromSuperview połączenia:

// With some valid UIView *view: 
for(UIView *subview in [view subviews]) { 
    [subview removeFromSuperview]; 
}

Jest to całkowicie bezwarunkowa, choć i będzie pozbyć wszystkich subviews w podany widok. Jeśli chcesz coś bardziej drobnoziarnistą, można podjąć jedną z kilku różnych metod:

  • zachować własne tablice poglądów różnych typów, dzięki czemu można wysyłać je removeFromSuperview wiadomości później w ten sam sposób
  • zachowują wszystkie Twoje widoki, w których je tworzysz, i trzymaj się wskaźników do tych widoków, aby móc je przesyłać pojedynczo w razie potrzeby
  • Dodaj do powyższej pętli oświadczenie if, sprawdzając równość klasy. Na przykład, aby usunąć tylko wszystkie UIButtons (lub niestandardowych podklasy UIButton), które istnieją w widoku, można użyć coś takiego:
// Again, valid UIView *view: 
for(UIView *subview in [view subviews]) { 
    if([subview isKindOfClass:[UIButton class]]) { 
     [subview removeFromSuperview]; 
    } else { 
     // Do nothing - not a UIButton or subclass instance 
    } 
}
+0

To była dla mnie ogromna pomoc. Dzięki! –

+1

Nice one mate. Dokładnie to, czego potrzebowałem. – Critter

9

Aby dodać do tego, co powiedział Tim, zauważyłem, że jesteś tagging Twój widok. Jeśli chcesz usunąć widok z określonym tagiem, możesz użyć:

[[myScrollView viewWithTag:myButtonTag] removeFromSuperview]; 
8

Nie sądzę, że powinieneś użyć szybkiej sugestii wyliczania.

Czy to nie jest wyjątek, jeśli zmienisz kolekcję, która jest iterowana? http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocFastEnumeration.html#//apple_ref/doc/uid/TP30001163-CH18-SW3

Ten przykład może być lepszy.

NSArray *subviews = [[scroller subviews] copy]; 
for (UIView *subview in subviews) { 
    [subview removeFromSuperview]; 
} 
[subviews release]; 
+0

To działa idealnie, dziękuję –

37

Stare pytanie; ale ponieważ jest to pierwsze trafienie w Google to pomyślałem, że również zanotować, że istnieje również ta metoda:

[[myScrollView subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

Nie może zrobić isKindOfClass sprawdzić z tym, ale to wciąż dobre rozwiązanie wiedzieć o.

Edytuj: Kolejnym punktem, na który należy zwrócić uwagę, jest to, że pasek przewijania w widoku przewijania jest dodawany jako widok podrzędny do tego przewijania. Tak więc, jeśli przejrzysz przez wszystkie subviews widoku przewijania, natkniesz się na to. Jeśli zostanie usunięty, doda się ponownie - ale ważne jest, aby to wiedzieć, jeśli spodziewasz się, że będą tam obecne podklasy UIView.

Poprawka dla Swift 3:

myScrollView.subviews.forEach { $0.removeFromSuperview() } 
+0

dzięki za informacje. –

+0

jesteś właścicielem ittt !!!!!!!! –

2

Problem z UIScrollView i in podklasa UIView jest to, że zawiera początkowo pewne poglądy (jak pionowego i poziomego paska przewijania dla UIScrollView). Stworzyłem więc kategorię UIView, aby usunąć Subviews odfiltrowane na klasie.

Na przykład:

[UIScrollView removeAllSubviewsOfClass:[FooView class],[BarView class],nil]; 

Kod:

- (void)removeAllSubviewsOfClass:(Class)firstClass, ... NS_REQUIRES_NIL_TERMINATION; 


- (void)removeAllSubviewsOfClass:(Class)firstClass, ... 
{ 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"FALSEPREDICATE"]; 

    va_list args; 
    va_start(args, firstClass); 

    for (Class class = firstClass; class != nil; class = va_arg(args, Class)) 
    { 
     predicate = [NSCompoundPredicate orPredicateWithSubpredicates:[NSArray arrayWithObjects:predicate,[NSPredicate predicateWithFormat:@"self isKindOfClass:%@",class], nil]]; 
    } 

    va_end(args); 
    [[self.subviews filteredArrayUsingPredicate:predicate] makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

} 
0

Najprostszym i najlepszym sposobem jest

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

    [subview removeFromSuperview]; 

} 
1

Najlepszym i najprostszym jest użycie

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

To rzeczywiście powoduje awarię jako podstawowa zasada jest tablica nie powinna modyfikować będąc wyliczone, aby zapobiec, że możemy użyć

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

Ale czasami katastrofy wciąż pojawiające ponieważ makeObjectsPerformSelector: będzie wyliczyć i dokonuje wyboru, także w operacje iOS 7 ui są zoptymalizowane do wykonywania bardziej szybciej niż w iOS 6, dlatego najlepszym sposobem na iterację tablicę odwrotnie i usuwania

NSArray *vs=[scrollView subviews]; 
for(int i=vs.count-1;i>=0;i--) 
{ 
    [((UIView*)[vs objectAtIndex:i]) removeFromSuperview]; 
} 

Uwaga: wyliczanie Harms modyfikacji ale nie iteracja ...

0
for(subview) in self.scrollView.subviews { 
     subview.removeFromSuperview() 
} 
Powiązane problemy