从上海华
答
这不是如何在循环工作。仅仅因为你指定了一个类型,并不意味着只有该类型的对象才会受到影响。 subviews
中的每个视图都会对removeFromSuperview
作出响应,因此无论它被投射为什么,它仍会被删除。
如果你只想删除Sprite
对象,那么你需要检查每个对象的类。
for (UIView *view in self.view.subviews)
{
if ([view isKindOfClass:[Sprite class]])
[view removeFromSuperview];
}
答
在这种情况下,子视图包含一切(精灵和其他对象)。你的枚举不仅返回精灵 - 它返回所有东西(但是松散地将它们转换成精灵)。在这种情况下,子视图的所有内容都会响应removeFromSuperview方法 - 因此所有内容都将被删除。
当您循环浏览子视图以确定是否需要删除时,您需要检查对象的类型。
答
您的代码在self.view的所有子视图上调用removeFromSuperview,因此它在写入时正常工作。这段代码运行的原因是因为Sprite可能是UIView的一个子类,所以编译器不会错误/警告你。你需要做的是更多这样的:
-(IBAction)clearAll:(id)sender{
for (UIView *aSubview in self.view.subviews){
if ([aSubview isSubclassOf
[sprite removeFromSuperview];
}
答
我们可以使用下面的语句它的父删除的UIView类型的所有实例。
[[self.view subviews] makeObjectsPerformSelector:@selector(removeFromSuperview)];
它看起来更干净,更简单,而不是做一个循环。