Назначение RootViewController для UIViewController дает предупреждение - почему? - PullRequest
1 голос
/ 22 сентября 2011

Я хочу получить доступ к RootViewController моего приложения в одном из его классов, чтобы представить контроллер модального представления.Я делаю это, получая ApplicationDelegate и запрашивая его для RootViewController и сохраняя его в UIViewController

AppDelegate *appDelegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
UIViewController* presentingViewController = appDelegate.viewController;

По моему мнению, это должно работать без предупреждения, поскольку RootViewController наследуется от UIViewController.Однако я получаю это предупреждение:

Несовместимые типы указателей, инициализирующие 'UIViewController * __ strong' выражением типа 'RootViewController *'

Может кто-нибудь объяснить мне, почему я вижуэто предупреждение?

Если это помогает - это AppDelegate, где я определяю RootViewController:

@interface AppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow            *window;
    RootViewController  *viewController;
}

@property (strong) RootViewController *viewController;

Я определил свой RootViewController следующим образом:

@interface RootViewController : UIViewController {

}

Ответы [ 2 ]

1 голос
/ 20 ноября 2011

Вы можете назначить объект переменной, объявленной как ее суперкласс.Это не проблема и очень полезно, когда вы хотите использовать методы суперкласса только над набором ваших собственных подклассов, особенно это часто встречается в контроллерах представления в стеке навигации, когда конкретный тип следующего контроллера представления неизвестен.Также подумайте об этом.Такие методы, как

[self presentModalViewController:customController animated:YES];

не будут работать без возможности сделать это.Этот метод объявлен как принимающий UIViewController *, но вы передаете пользовательский подкласс UIViewController без жалоб.Наконец

[rootViewController isKindOfClass:[UIViewController class]];

вернет ДА.QED.

Вы уже объявили свой класс RootViewController в заголовке для вашего делегата приложения?то есть

@class RootViewController;
@interface AppDelegate : NSObject <UIApplicationDelegate> {
....

Правильно ли вы написали?Это общая область для неправильного ввода, поскольку xCode не выполняет автозаполнение форвардных объявлений.Затем он автоматически завершит вашу опечатку в остальной части файла заголовка.

Не забыли ли вы импортировать файл заголовка для RootViewController в файл .m для AppDelegate?Вам все равно нужно будет это сделать, чтобы компилятор знал об инерционности.

В данный момент ваш код выглядит правильно, но у нас его нет.

0 голосов
/ 22 сентября 2011

Проблема в том, что RootViewController не является тем же классом, что и UIViewController.

В AppDelegate вы объявляете viewController типа RootViewController.Затем в следующих строках:

AppDelegate *appDelegate = (AppDelegate *) [UIApplication sharedApplication].delegate;
UIViewController* presentingViewController = appDelegate.viewController;

Вы создаете presentingViewController типа UIViewController и присваиваете ему экземпляр RootViewController.Это источник ошибки.

Исправьте это, используя согласованный тип.

Read В чем разница между классами RootViewController, AppDelegate и View Controller, которые я могу создать? для хорошего объяснения различия между этими двумя типами.

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