0

因此,我有一个 UIScrollView,其中填充了一系列 MyCustomViews,这些 MyCustomViews 是标准 UIView 的子类。在委托回调“scrollViewDidScroll”中,我试图遍历所有子视图并在它们上调用特定函数,但我认为类型转换不起作用。下面是我的代码:

- (void)scrollViewDidScroll:(UIScrollView *)scrollView{

    for(UIView *subView in [scrollView subviews){

        MyCustomView *customView = (MyCustomView *)subView;
        [customView myMethod];
    }
}

当我在 customView 上调用“myMethod”时,程序崩溃说一个无法识别的选择器被发送到实例。我相信我的类型转换是问题,因为 myMethod 方法在其他情况下也有效。那么我该如何补救这种情况呢?

4

2 回答 2

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];
}
于 2013-11-07T23:48:59.873 回答
0

对于“抓住”这个问题,使用

if([customView respondsToSelector:@selector(myMethod)]){
    [customView myMethod];
}

有了这个,应用程序就不会崩溃。

也供您使用for(MyCustomView* customView in [scrollView subviews]){

于 2013-11-07T23:47:04.953 回答