[英]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.