2009-08-21 126 views
32

我如何從我的滾動視圖中刪除所有子視圖...如何從scrollview中刪除子視圖?

我有一個UIView,並在滾動視圖像這樣它上面的按鈕....

這裏是我的代碼中添加滾動子視圖視圖

-(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));} 
} 

和這裏是代碼以除去子視圖

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

回答

102

要從任何視圖中刪除所有的子視圖,您可以通過子視圖迭代,並互送一個removeFromSuperview電話:

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

這完全是無條件的,雖然,在將擺脫所有子視圖給定的觀點。如果你想要的東西更細粒度的,你可以採取幾種不同的方法:

  • 維護自己的觀點不同類型的數組,所以你可以以同樣的方式removeFromSuperview郵件發送它們
  • 保留所有您創建視圖的位置,並保留指向這些視圖的指針,因此您可以根據需要單獨發送removeFromSuperview
  • if語句添加到上面的循環中,檢查類相等性。例如,僅去除存在於一個視圖中的所有UIButtons(或UIButton的自定義子類),你可以使用類似:
// 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

這對我有很大的幫助。謝謝! – 2010-07-13 03:38:50

+1

不錯的一個伴侶。正是我需要的。 – Critter 2011-04-08 18:19:08

9

要添加到什麼蒂姆說,我注意到,您標記你的意見。如果你想刪除某個標籤的視圖,你可以使用:

[[myScrollView viewWithTag:myButtonTag] removeFromSuperview]; 
8

我不認爲你應該使用快速枚舉建議。

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

這難道不應該,如果你改變集合拋出一個異常被迭代? http://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocFastEnumeration.html#//apple_ref/doc/uid/TP30001163-CH18-SW3

這個例子可能會更好。

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

完美的作品,謝謝 – 2011-04-12 07:18:32

37

老問題;但因爲它是在谷歌第一主打爲了這個,我想我還記有也是這種方法:

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

你不能做的isKindOfClass這種檢查,但它仍然是一個很好的解決知道關於。

編輯:另一點需要注意的是,scrollview的滾動條作爲子視圖添加到該滾動視圖。因此,如果你迭代scrollview的所有子視圖,你會遇到它。如果被移除,它會再次添加自己 - 但如果您只希望自己的UIView子類在那裏,那麼知道這一點很重要。

修訂爲夫特3:

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

感謝您的信息。 – 2011-05-26 11:15:16

+0

你擁有ittt !!!!!!!! – 2012-08-19 00:21:19

2

與的UIView的UIScrollView的和其他亞類的問題是,它們最初包含一些視圖(像用於UIScrollView的垂直和水平滾動條)。所以我創建了一個UIView類來刪除在這個類上過濾的Subviews。

例如:

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

代碼:

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

的最簡單有效的辦法就是

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

    [subview removeFromSuperview]; 

} 
1

最好的和最簡單的就是使用

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

這確實會導致崩潰的基本規則是數組不應該修改而被枚舉,以防止我們可以使用

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

但有時崩潰將繼續出現,因爲makeObjectsPerformSelector:將枚舉並進行選擇,還的iOS 7 UI操作進行優化,以執行除在IOS 6更快,因此,爲了反向迭代陣列和除去

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

注意的最佳方式:枚舉危害修改,但不進行迭代...

0
for(subview) in self.scrollView.subviews { 
     subview.removeFromSuperview() 
}