簡體   English   中英

從超級視圖中刪除所有實例

[英]Remove all instances from superview

我正在嘗試使用以下代碼刪除屏幕上的所有Sprites(UIImageViews):

-(IBAction)clearAll:(id)sender{
      for (Sprite *sprite in self.view.subviews){
      [sprite removeFromSuperview];
}

但是,運行此代碼時,將刪除我的情節提要中不是Sprite的元素。 實際上,視圖中的所有內容都已被刪除。

到底是怎么回事?

這不是for循環工作的方式。 僅僅因為您指定了一種類型,並不意味着僅該類型的對象會受到影響。 subviews視圖中的每個視圖都對removeFromSuperview做出響應,因此無論將其removeFromSuperview為何種形式,它都將被刪除。

如果只想刪除Sprite對象,則需要檢查每個對象的類。

for (UIView *view in self.view.subviews)
{
    if ([view isKindOfClass:[Sprite class]])
        [view removeFromSuperview];
}

我們可以使用以下語句從其SuperView中刪除所有UIView類型的實例。

[[self.view subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];

它看起來更干凈,更簡單,而不是循環播放。

在這種情況下,子視圖包含所有內容(子畫面和其他對象)。 您的枚舉不僅返回精靈,還返回所有內容(但將其松散地“投射”為精靈)。 在這種情況下,作為子視圖的所有內容都會對removeFromSuperview方法做出響應-因此,所有內容都將被刪除。

在子視圖中循環時,需要檢查對象的類型,以確定是否需要刪除該對象。

您的代碼正在self.view的所有子視圖上調用removeFromSuperview,因此在編寫時可以正常工作。 這段代碼運行的原因是因為Sprite可能是UIView的子類,因此編譯器不會錯誤/警告您。 您需要做的更像是這樣:

-(IBAction)clearAll:(id)sender{
    for (UIView *aSubview in self.view.subviews){
    if ([aSubview isSubclassOf
    [sprite removeFromSuperview];
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM