我有一个自定义的UIButton子类。实际上很多人。
所以我想通过for-in循环在我的containerView.subviews中枚举所有这些。 但当我这样运行时:
for (CustomButton *button in self.containerView.subviews)
{
NSLog(@"%@", button.class);
}
...第一个被迭代的对象是UIImageView,它也是一个子视图。为什么for-in循环只给我一个我想要的课程?
答案 0 :(得分:5)
它将遍历数组中的所有对象并尝试转换为CustomButton类。你需要做一些过滤:
for (CustomButton *button in self.containerView.subview)
{
if ([button isKindOfClass: [CustomButton class]])
NSLog(@"%@", button.class);
}
答案 1 :(得分:2)
for-in循环正是它应该做的事情。它遍历容器视图的所有子视图(单元格或滚动视图?)。
您可以递归处理它们,以便以相同的方式浏览子视图的所有子视图(如果有)。 至少这就是我要做的。
然后检查类类型(使用isKindOfClass)并仅处理您感兴趣的类型。
您会惊讶地看到按钮可能有多少个子视图。
编辑:到目前为止,我还没有提到你问题的另一个方面。你要求for-in循环的“歧视”。它不是循环的一个方面。 For-in简单迭代容器的所有元素。这可能是数组,字典或集合。在您的示例中,您只需将每个对象强制转换为CustomButton类型对象。 这样,即使您访问自定义按钮特有的属性或方法,编译器也会毫无错误地传递。然后将在运行时抛出异常。