Я разрабатываю приложение на основе документов. Я использую выделенный оконный контроллер для окна документа и вызываю метод -[NSDocument makeWindowControllers]
.
Мой оконный контроллер инициализируется следующим образом:
- (instancetype) init
{
if (self = [super initWithWindowNibName:@"Document" owner:self]) {
}
return self;
}
Здесь @"Document"
— это файл .xib, содержащий главное окно документа, созданное вместе с проектом.
Смысл здесь в том, что этот оконный контроллер всегда инициализируется с этим типом окна, поэтому этот параметр жестко закодирован и скрыт внутри реализации -init
(при этом удобно настроить владельца окна на self
).
Таким образом, сторона, которая создает экземпляр оконного контроллера (в моем случае, класс документа), не должна беспокоиться о том, какой перо использовать, и может просто вызвать -init
.
Проблема в том, что я нарушаю назначенную цепочку инициализаторов, и Xcode жалуется на эти предупреждения:
Семантическая проблема Переопределение метода для назначенного инициализатора суперкласса '-initWithCoder:' не найдено.
Семантическая проблема В назначенном инициализаторе отсутствует «супер» вызов назначенного инициализатора суперкласса.
Семантическая проблема Переопределение метода для назначенного инициализатора суперкласса '-initWithWindow:' не найдено.
Семантическая проблема Назначенный инициализатор вызвал неназначенный инициализатор.
Я бы переключил вызов на -initWithWindowNibName:owner:
с одним на -initWithWindow:
(и после этого установить владельца вручную, наверное?); но я не знаю, как создать NSWindow
непосредственно из пера (или правильно ли это делать).
EDIT: я только что обнаружил, что предупреждения запускаются только потому, что я пометил -init
как NS_DESIGNATED_INITIALIZER
в своем интерфейсе. Я могу удалить эту метку, и предупреждения исчезнут, но -init
является моим де-факто назначенным инициализатором, поэтому я бы предпочел оставить его.