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