Где _mainViewController объявлен и инициализирован? - PullRequest
0 голосов
/ 08 апреля 2011

Я недавно обновил свою IDE до XCode 4.0 и увидел странное изменение в коде пластины приложения Utillity:

Сначала файл MainViewController.h-File:

#import <UIKit/UIKit.h>
@class MainViewController;

@interface UtilityAppDelegate : NSObject <UIApplicationDelegate> {
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet MainViewController *mainViewController;
@end

Вопрос 1: Где «mainViewController» объявлен в первую очередь?Я нигде не нашел.

В * .m-файле есть оператор

@synthesize mainViewController=_mainViewController;

.Итак, мой второй вопрос: где спрятан _mainViewController?Не могу найти объявление нигде.Я думаю, что это происходит из основного файла * .nib.

Но есть еще одна проблема: я добавил UINavigationController в один из моих недавних проектов и мне больше не нужен mainViewController.Но когда я удаляю @property и @synthesize из MainViewController.m / .h, я больше не могу запустить приложение из-за этого исключения:

setValue:forUndefinedKey:]: this class is not key value coding-compliant for the key mainViewController.'

в этой строке

    int retVal = UIApplicationMain(argc, argv, nil, nil);

в main.m.

Спасибо за вашу помощь.

Ответы [ 3 ]

1 голос
/ 08 апреля 2011

Посмотрите на ваш info.plist, он должен быть там объявлен.Если вы создали свое приложение с шаблоном, оно настраивается plist.Это делает неявное объявление, mainWindow.xib (в моем примере) содержит больше, чем окно.Есть соединения с appDelegate и viewController, см. Второй скриншот.

Последняя строка скриншота:

enter image description here

enter image description here

0 голосов
/ 08 апреля 2011

Вопрос 1:

Когда вы используете такое объявление, вам также не нужно явно определять свойство.

.h

@property (nonatomic, retain) IBOutlet MainViewController *mainViewController;

.m

@synthesize mainViewController=_mainViewController;

Вопрос 2:

_mainViewController не скрыт.Он указывает на mainViewController, который неявно определен в операторе @property в .h

@synthesize mainViewController=_mainViewController;

Этот формат используется для различения ивара и других свойств.Это относится к mainViewController.

Вопрос 3:

Вы удалили объявление @ property / @ synthesize для mainViewController, но оно все еще существует в файле пера (IB).Удалите его из IB, и все будет хорошо.

0 голосов
/ 08 апреля 2011

Вы впервые сталкиваетесь с новым ABI. Больше нет необходимости фактически объявлять переменные для свойств. Если вы используете @property и @synthesize, для вас автоматически будет создан резервный ивар.

Возможно, вы получаете ошибку KVC, потому что NIB все еще ссылается на старое свойство. Вы должны увидеть предупреждение об этом во время компиляции. В IB посмотрите на своего делегата приложения; у него, вероятно, все еще есть выход для mainViewController, и вы, вероятно, все еще генерируете MainViewController. Вам необходимо удалить их из NIB.

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