2

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

这就是我所做的:

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
}
4

3 回答 3

3

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

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

[object performSelector:@selector(doSomething)]; 

请参阅讨论:使用 -performSelector:与仅调用方法

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

如果要传递多个对象,则必须将它们包装在一个容器对象中,如iOS - How to implement a performSelector with multiple arguments and with afterDelay? .

于 2013-02-01T17:17:29.850 回答
1

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

UIViewController *firstViewController;
// ...

[(FirstViewController *)firstViewController openView:subItem.itemText.text inView:activeScreen];
于 2013-02-01T17:15:35.873 回答
0

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

这应该够了吧。

于 2013-02-01T17:16:39.847 回答