将对象(UIView控制器)强制转换为其未知的子类



我开发了一个用于滑动UIView的通用控制器,我管理UIViewController(显然是子类),并且只有在UIViewController的子类响应此方法时才必须调用特定方法(冻结):

-(void)freezeRootViewController
{
    if([_rootViewController respondsToSelector:@selector(freeze)])
        [ ((id) _rootViewController) freeze];
}

我不知道_rootViewController的类,但我知道它是UIViewController的子类,因此我试图将_rootViewController转换为ID,但我无法编译:

环境:XCode 4.5.1,带 ARC 的 iOs 4.3+

错误:"不知道选择器'冻结'的实例方法"

注意:我不能强迫开发人员为_rootViewController使用特定的UIViewController子类。

在检查"泛型"类型是否响应选择器后,您可以使用 performSelector:/performSelector:withObject: 调用它,如果它是一个简单的 0-1 参数方法,否则使用 NSInvocation 。由于freeze没有参数,因此您只需使用performSelector:.

-(void)freezeRootViewController
{
    if([_rootViewController respondsToSelector:@selector(freeze)])
        [_rootViewController performSelector:@selector(freeze)];
}

这似乎是一个警告而不是错误 - 您应该能够编译代码并忽略此诊断消息。但是,如果你想完全摆脱它,你可以声明一个协议并按如下方式进行强制转换:

@protocol MyProtocol <NSObject>
- (void)freeze;
@end
[(id <MyProtocol>)_rootViewController freeze];

最新更新