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