Iphone 忽略“UIViewController可能不响应[method]”警告的方法

Iphone 忽略“UIViewController可能不响应[method]”警告的方法,iphone,ios,objective-c,cocoa-touch,Iphone,Ios,Objective C,Cocoa Touch,有没有办法让编译器忽略这个特定的警告 我是这样做的: UIViewController *firstViewController = AppDelegate.instance.viewController; //open the view of the clicked subItem if ([firstViewController respondsToSelector:@selector(openView:inView:)]) { [firstViewController openV

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

我是这样做的:

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
}

在这种情况下,只需发出显式类型转换转换转换:

UIViewController *firstViewController;
// ...

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

在这种情况下,只需发出显式类型转换转换转换:

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];
}

这应该可以解决问题。

确保导入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];
}

这样就可以了。

您应该在适当的地方将对象强制转换为正确的类型。请注意,如果愿意,您可以“强制转换”到协议。这样,您就可以安全地知道所需的方法是如何实现的,而不必知道具体的类型

如果希望编译器不抱怨,可以调用PerformSelect:。但这样就不会进行编译时检查

见讨论:

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


如果要传递多个对象,必须将它们包装在容器对象中,如中所述。

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

如果希望编译器不抱怨,可以调用PerformSelect:。但这样就不会进行编译时检查

见讨论:

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


如果要传递多个对象,必须将它们包装在容器对象中,如中所述。

但此修复程序在将来不起作用-为什么不?你应该这样做。@H2CO3更新了我的问题。谢谢。你可以扔掉这个对象,然后看看我的答案。但是这个修复在将来不会起作用——为什么不呢?你应该这样做。@H2CO3更新了我的问题。谢谢。你可以扔掉这个物体,然后看看我的答案。你也不能有多个参数。是的。有了这些,我就没有理由了。我认为这是解决我问题的最好办法。谢谢。如果您可以定义一个协议,然后转换到该协议,并使适当的具体对象符合该协议,我将避免使用performSelector。有编译时检查更好。而且不能有多个参数。是的。有了这些,我就没有理由了。我认为这是解决我问题的最好办法。谢谢。如果您可以定义一个协议,然后转换到该协议,并使适当的具体对象符合该协议,我将避免使用performSelector。最好有编译时检查。只要阅读你的更新。不要担心将来,在iOS上,您将不会动态链接到该代码。您将不需要防范过去存在但现在不存在的方法,也不需要防范将来可能存在的新方法。苹果这样做是因为你在动态链接到他们的框架。你的iOS代码永远做不到这一点,Mac代码可以。请阅读你的更新。不要担心将来,在iOS上,您将不会动态链接到该代码。您将不需要防范过去存在但现在不存在的方法,也不需要防范将来可能存在的新方法。苹果这样做是因为你在动态链接到他们的框架。你的iOS代码永远做不到,Mac代码可以做到。