忽略"UIViewController may not respond to [method]"警告的方法



有没有办法让编译器忽略这个特定的警告?

这是我的工作:

UIViewController *firstViewController = AppDelegate.instance.viewController;
//open the view of the clicked subItem
if ([firstViewController respondsToSelector:@selector(openView:inView:)]) {
    [firstViewController openView:subItem.itemText.text inView:activeScreen]; //warning on this line
}

我知道一种有效的方法是将UIViewController更改为ViewController(它的类的名称)。但是此修复程序将来不起作用,所以我只是在寻找一种忽略此警告的方法。

它将来不起作用,因为,我将做这样的事情:

//.m
UIViewController *firstViewController;
//.h
if (someCondition) {
firstViewController = AppDelegate.instance.viewController;
}
else{
firstViewController = AppDelegate.instance.otherViewController;
}
if ([firstViewController respondsToSelector:@selector(openView:inView:)]) {
    [firstViewController openView:subItem.itemText.text inView:activeScreen]; //warning on this line
}

在适当的情况下,应将对象强制转换为正确的类型。请注意,如果您愿意,可以"投射"到协议。这使您可以安全地知道已实现所需的方法,而不必知道具体类型。

如果你只想让编译器不抱怨,可以通过调用performSelector: .但是这样你就不会得到编译时检查。

[object performSelector:@selector(doSomething)]; 

请参阅讨论:使用 -performSelector: vs. 仅调用该方法

如果要将一个对象只传递给选择器,可以使用变体performSelector:withObject:

如果要传递多个对象,则必须将它们包装在一个容器对象中,如iOS - 如何使用多个参数和afterDelay实现执行选择器?中所述。

在这种情况下,您可以只发出显式类型转换(强制转换):

UIViewController *firstViewController;
// ...
[(FirstViewController *)firstViewController openView:subItem.itemText.text inView:activeScreen];

确保导入 FirstViewController.h,以便编译器知道该方法。稍微调整一下你的代码:

UIViewController *vc = AppDelegate.instance.viewController;
//open the view of the clicked subItem
if ([vc respondsToSelector:@selector(openView:inView:)]) {
    FirstViewController *firstViewController = (FirstViewController *) vc;
    [firstViewController openView:subItem.itemText.text inView:activeScreen];
}

这应该可以解决问题。

相关内容