0

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

4

2 回答 2

2

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

-(void)freezeRootViewController
{
    if([_rootViewController respondsToSelector:@selector(freeze)])
        [_rootViewController performSelector:@selector(freeze)];
}
于 2012-11-14T17:58:17.440 回答
1

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

@protocol MyProtocol <NSObject>

- (void)freeze;

@end

[(id <MyProtocol>)_rootViewController freeze];
于 2012-11-14T17:36:20.690 回答