2009-01-08 75 views
2

我目前正在编写一个iPhone应用程序,它使用UITabBarController和5个以上的标签栏项目。因此,会自动生成一个“更多”标签(如在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文件可用。

回答

10

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

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

那么你不需要#import@class声明。

0

您不应该声明或#import任何标准的Cocoa Touch类。 UIMoreListController看起来不像它是目前应该使用的公共类,如果它是在文档中列出的话。您链接到的页面是一个SDK转储,如果您计划在App Store中发布您的应用程序,则并非所有内容都可以安全使用。

尽管如此,您可以将其声明为类型ID,并且如有必要,可以使用任何需要调用的UIMoreListController特定方法在NSObject上声明一个类别。

0

将其声明为类型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。 (我可能是错的,但我会尝试)

0

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

+0

你是对的。我决定使用不同的方法: http://pastebin.com/f28191612 这足以检测UIMoreListController,我希望。 – user123444555621 2009-01-14 15:27:54

0

只要你在moreNavigationController的代表是,这应该做的伎俩:

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

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