2015-03-30 4 views
0

Я работаю с архитектурой документа в Cocoa, но создаю свое собственное окно вместо наконечника. Я заменяю NSApplicationMain кодом, который работал для приложений , а не, используя архитектуру документа.Сбой инициализации NSApplication: создание нескольких приложений

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     NSApplication *app = [[NSApplication alloc] init]; 
     AppDelegate *appDelegate = [[AppDelegate alloc] init]; 
     [app setDelegate:appDelegate]; 
     [app run]; 
    } 
} 

Но с архитектурой документа, когда я создаю окно (я знаю, что это не так, чтобы создать одну, но для простоты) ...

- (void)applicationDidFinishLaunching:(NSNotification *)notification { 
    NSWindow *window = [[NSWindow alloc] init]; 
} 

... Я получаю ниже.

*** Assertion failure in -[NSApplication init], /SourceCache/AppKit/AppKit-1344.72/AppKit.subproj/NSApplication.m:1787 

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

http://i.stack.imgur.com/RR3nK.png

Все, что я пытался приводит к ошибке выше всякий раз, когда я создаю окно, независимо от того, где я создаю его. Один из возможных источников ошибок заключается в том, что я начинаю процесс создания документа с OpenUntitledDocumentAndDisplay:error: внутри моего метода appмоего приложения appDelegate, и в этом случае NSApplication может рассмотреть это как создание документа слишком рано.

Вкратце, почему создание объекта окна в архитектуре документа приводит к ошибке NSApplication, в частности, что я создаю несколько приложений?

+0

Фрагмент кода, по-видимому, находится в противоречии с изображением png, на которое вы ссылаетесь, - при распределении оголенного окна отсутствует NSWindowController, NSDocument и NSDocumentController. Но ты это так говоришь. Поэтому я спрошу, переопределяете ли вы defaultType в подклассе NSDocumentController? Вы переопределяете makeWindowControllers в подклассе NSDocument? Если да, зачем вам явно создавать оконный контроллер?Вы должны получить один из makeWindowControllers. – stevesliva

+0

Трудно сказать, не видя ваш код, но я бы предположил, что вы уничтожили какую-то другую часть логики «NSAppplication», а проблема с окном - просто красная селедка. – cacau

+0

Я не вижу причины переопределять defaultType. Правильный тип читается из info.plist. Да, я переопределяю makeWindowControllers (но не в простом примере выше), и внутри этого метода вручную создается окно. Когда я создаю это окно, которое он жалуется. Я переписал приложение в новом шаблоне, но получил такую ​​же ошибку. –

ответ

0

Глядя на мой собственный код для работы без NSApplicationMain(), вы не alloc initNSApplication экземпляр.

Вы должны сделать this-- использовать метод генератора sharedApplication одноплодной:

NSApplication *application = [NSApplication sharedApplication]; 

См, например, the answer here. Я также говорю о нескольких других вещах, которые ломаются, когда NSApplicationMain() не используется.

@cacau заставил меня коситься на это утверждение. Он находится в методе NSApplication init, который вы вызываете в самой первой строке приложения. Похоже, что исключение происходит там, если вы установили точку останова исключения?

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

Для чего это стоит, то sharedApplication ссылка говорит:

Этот метод также устанавливает соединение с сервером окна и завершает другую инициализацию. Ваша программа должна вызывать этот метод как одно из первых операторов в main(); этот вызов выполняется для вас, если вы создаете приложение с помощью Xcode.

+0

Вот и все! Огромное спасибо. Я сделал правильную sharedApplication с приложениями без документов, но когда я написал это, я бездумно создал приложение с помощью alloc init. Соединение sharedApplication с сервером окон, вероятно, вызвало ошибку окна. У вас есть идея, почему метод sharedApplication имеет слово «shared»? –

+0

["Имя фабричного метода, возвращающего экземпляр singleton, имеет, по соглашению, форму sharedClassType. Примерами из фреймворков Cocoa являются sharedFileManager, sharedColorPanel и sharedWorkspace."] (Https://developer.apple.com/library/ mac/documentation/General/Conceptual/DevPedia-CocoaCore/Singleton.html) Так что это просто старая номенклатура одноразовых какао. – stevesliva

+0

Да, так нет очевидной причины. –

Смежные вопросы