2

我目前正在编写一个 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

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

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

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

4

5 回答 5

10

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

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

那么你就不需要#importor@class声明了。

于 2009-01-08T19:23:08.967 回答
0

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

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

于 2009-01-08T16:45:52.577 回答
0

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

这不会成功。我只需要

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

无论如何,通过 App Store 发布肮脏的黑客是正确的。不幸的是,参考对那些moreNavigationController有点保密。他们告诉您它只是一个 UINavigationController(确实如此)。

也许我应该尝试一种不同的方法来确定 viewController 是否是一些 UIMoreListController。就像是

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

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

于 2009-01-08T18:50:10.313 回答
0

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

于 2009-01-10T12:48:57.757 回答
0

只要您在moreNavigationController's 代表中,这应该可以解决问题:

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

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

于 2010-02-03T17:13:57.317 回答