如何禁用转发类编译器警告(未记录的类)

时间:2009-01-08 16:21:44

标签: objective-c xcode compiler-construction

我目前正在编写一个iPhone应用程序,该应用程序使用带有超过5个Tab Bar项的UITabBarController。因此,会自动生成“更多”标签(例如,在YouTube应用中)。 我发现相应的视图控制器类是UIMoreListController,但我没有任何相应的.h文件。所以,我的代码看起来像这样:

@class UIMoreListController; // can't use #import since .h file is missing

@implementation SomeUINavigationControllerDelegate

- (void)navigationController:(UINavigationController *)navigationController
        willShowViewController:(UIViewController *)viewController
        animated:(BOOL)animated
{
     if ([viewController isKindOfClass:[UIMoreListController class]])
         ... // do something if "more" view is active

这就像一个魅力。但是,编译器一直在给我

  

警告:接收者'UIMoreListController'是一个转发类,对应的@interface可能不存在

是否有一种巧妙的方法来消除此警告(仅限此警告)?同样,我不能使用#import,因为没有.h文件可用。

5 个答案:

答案 0 :(得分:10)

如果您只是想检查UIMoreListController类,可以使用objc-api访问类变量。

if ([viewController isKindOfClass:NSClassFromString(@"UIMoreListController")])

然后您不需要#import@class声明。

答案 1 :(得分:0)

您不必声明或#import任何标准Cocoa Touch类。 UIMoreListController看起来不像你现在应该使用的公共类,如果它将在文档中列出的话。您链接到的页面是SDK转储,如果您打算在App Store中发布应用程序,则不能安全使用它。

尽管如此,你可以将它声明为类型id,如果需要,可以使用你需要调用的任何UIMoreListController特定方法在NSObject上声明一个类别。

答案 2 :(得分:0)

  

将其声明为type id,如果需要,可以使用您需要调用的任何UIMoreListController特定方法在NSObject上声明一个类别。

这不会起作用。我只需要

if ([viewController isKindOfClass:[UIMoreListController class]])

无论如何,你通过App Store发布肮脏的黑客是正确的。不幸的是,the Reference is somewhat secretive about those moreNavigationControllers。他们告诉你它只是一个UINavigationController(确实如此)。

也许我应该尝试一种不同的方法来查明viewController是否是某个UIMoreListController。像

这样的东西
if ([viewController isEqual:[navigationController topViewController]])

应该可以工作,因为UIMoreListController始终是topViewController。 (我可能错了,但我要试试)

答案 3 :(得分:0)

你为什么要这样做?您不应该使用任何私有API。不能保证这个类在下一个操作系统版本中仍然存在,如果你认为它是,那么这条路会导致错误甚至崩溃。

答案 4 :(得分:0)

只要您在moreNavigationController的委托中,这应该可以解决问题:

[viewController isEqual:[navigationController.viewControllers objectAtIndex:0]]

相比之下,topViewController会给你与你想要的相反的东西。使用objectAtIndex:0应该有助于避免任何私人诡计。