【问题标题】:How to disable forward class compiler warning (undocumented class)如何禁用前向类编译器警告(未记录的类)
【发布时间】:2010-09-30 07:23:13
【问题描述】:

我目前正在编写一个 iPhone 应用程序,该应用程序使用具有 5 个以上选项卡栏项的 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

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

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

有没有一种巧妙的方法可以消除这个警告(并且仅限于这个特定的警告)?同样,我不能使用#import,因为没有可用的 .h 文件。

【问题讨论】:

    标签: objective-c xcode compiler-construction


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

      话虽如此,您可以将其声明为类型 id,并在必要时使用您需要调用的任何 UIMoreListController 特定方法在 NSObject 上声明一个类别。

      【讨论】:

        【解决方案3】:

        将其声明为类型 id,并在必要时使用您需要调用的任何 UIMoreListController 特定方法在 NSObject 上声明一个类别。

        这不会解决问题。我只需要

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

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

        也许我应该尝试一种不同的方法来确定 viewController 是否是某个 UIMoreListController。类似的东西

        if ([viewController isEqual:[navigationController topViewController]])
        

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

        【讨论】:

          【解决方案4】:

          只要您是 moreNavigationController 的代表,就可以解决问题:

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

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

          【讨论】:

            【解决方案5】:

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

            【讨论】:

            • 你说得对。毕竟我决定使用不同的方法:pastebin.com/f28191612 我希望这足以检测 UIMoreListController。
            猜你喜欢
            • 1970-01-01
            • 2018-08-31
            • 2023-01-24
            • 2013-01-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-04
            • 1970-01-01
            相关资源
            最近更新 更多