Как отключить предупреждение компилятора класса forward (недокументированный класс) - PullRequest
2 голосов
/ 08 января 2009

В настоящее время я пишу приложение для 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.

Ответы [ 5 ]

10 голосов
/ 08 января 2009

Если вы просто пытаетесь проверить класс UIMoreListController, вы можете получить доступ к переменной класса с помощью objc-api.

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

Тогда вам не нужно объявление #import или @class.

0 голосов
/ 03 февраля 2010

Пока вы в делегате moreNavigationController, это должно сработать:

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

Для сравнения topViewController даст вам противоположность того, что вы хотите. Использование objectAtIndex:0 должно помочь избежать любых частных махинаций.

0 голосов
/ 10 января 2009

Почему вы пытаетесь это сделать? Вы не должны использовать какие-либо частные API. Нет гарантии, что этот класс все еще будет присутствовать в следующем выпуске ОС, и если вы предполагаете, что это так, то эта дорога приводит к ошибкам или даже сбоям.

0 голосов
/ 08 января 2009

объявите его как идентификатор типа и, если необходимо, объявите категорию для NSObject с любым из специфических методов UIMoreListController, которые нужно вызвать.

Это не поможет. Все что мне нужно это

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

В любом случае, вы правы, выпуская грязные хаки через App Store. К сожалению, Ссылка несколько скрытна о тех, moreNavigationController s . Они говорят вам, что это просто UINavigationController (который, действительно, так и есть).

Может быть, я должен попробовать другой подход, чтобы выяснить, является ли viewController каким-то UIMoreListController. Что-то вроде

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

должно работать, так как UIMoreListController всегда является topViewController. (Я могу ошибаться, но я попробую)

0 голосов
/ 08 января 2009

Вам не нужно объявлять или #import любого из стандартных классов Cocoa Touch. UIMoreListController не выглядит как публичный класс, который вы должны использовать в настоящее время, если бы он был указан в документации. Страница, на которую вы ссылаетесь, является дампом SDK, не все на ней безопасно использовать, если вы планируете выпустить свое приложение в App Store.

С учетом сказанного вы можете объявить его как идентификатор типа и, если необходимо, объявить категорию для NSObject с любым из специфических методов UIMoreListController, которые необходимо вызвать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...