所以我有一个UIScrollView,其中填充了一系列MyCustomViews,它们是标准UIView的子类。在委托回调“scrollViewDidScroll我试图循环遍历所有子视图并调用它们上的特定函数,但我不认为类型转换是有效的。这是我的代码如下:
- (void)scrollViewDidScroll:(UIScrollView *)scrollView{
for(UIView *subView in [scrollView subviews){
MyCustomView *customView = (MyCustomView *)subView;
[customView myMethod];
}
}
当我在customView上调用“myMethod”时,程序崩溃说一个无法识别的选择器被发送到实例。我相信我的类型转换是myMethod在其他情况下工作的方法。那么我该如何解决这种情况呢?
答案 0 :(得分:5)
解决方案1:
如果您执行以下操作,则甚至无需将对象强制转换为MyCustomView *
。它可以是任何类型,例如的UIView。
if([subView respondsToSelector:@selector(myMethod)]) {
[subView performSelector:@selector(myMethod)];
}
解决方案2:
您可以在进行演员表之前检查对象类型。
if([subView isKindOfClass:[MyCustomView class]]) {
MyCustomView *customView = (MyCustomView *)subView;
[customView myMethod];
}
答案 1 :(得分:0)
要“抓住”此问题,请使用
if([customView respondsToSelector:@selector(myMethod)]){
[customView myMethod];
}
并且这样,应用程序不会崩溃。
同样在您的使用中for(MyCustomView* customView in [scrollView subviews]){