将对象(UIViewController)转换为其未知子类

时间:2012-11-14 17:32:53

标签: objective-c ios

我开发了一个用于滑动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子类。

2 个答案:

答案 0 :(得分:2)

检查“generic”类型是否响应选择器,如果它是一个简单的0-1参数方法,则使用performSelector: / performSelector:withObject:调用它,否则使用NSInvocation 。由于freeze没有参数,您只需使用performSelector:

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

答案 1 :(得分:1)

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

@protocol MyProtocol <NSObject>

- (void)freeze;

@end

[(id <MyProtocol>)_rootViewController freeze];