Приложение какао на основе документа с одним документом - PullRequest
2 голосов
/ 02 августа 2011

Есть ли способ создать приложение какао на основе документа с одним документом (SDI)? Я не хочу, чтобы пользователь открывал несколько документов одновременно.

Ответы [ 2 ]

3 голосов
/ 10 сентября 2012

Вы можете сделать это, это не так уж плохо.

Общий подход: используйте NSDocument, который вы должны присоединить к одноэлементному NSWindowController, который является платформой вашего приложения.Вы можете даже иметь другие вещи в этом окне, когда нет открытых документов.Этот дизайн отлично работает для меня, так как я сохранил все функции NSDocument в игре и т. Д ...

Здесь мы расскажем подробнее:


Удалите все остальные окна

Вы будете использовать новое окно, поэтому удалите все, что может быть по умолчанию в шаблоне вашего приложения, созданного XCode.Возможно, в вашем MainMenu.xib, избавьтесь от всего этого или переместите его на новый xib.

Создайте новый xib (окно) для вашего будущего NSWindowController

Просто создайте заполнитель для тестированияпозже мы добавим к нему гораздо больше (поскольку это наше главное окно, которое пользователь всегда будет видеть).

Создайте свой собственный NSWindowController, сделайте его одиночным

Итак, внутри вашего NSWindowController,создайте одноэлементную оболочку, которая загружает ваш xib (только один раз) и возвращает этот единственный синглтон каждый раз, когда он вызывается.Я использовал помощник #define, смотрите здесь для получения дополнительной информации: https://gist.github.com/1057420

+ (id) singletonInstance {
    DEFINE_SHARED_INSTANCE_USING_BLOCK(^{
        return [[self alloc] initWithWindowNibName:@"yourxibfilename"];
    });
}

Измените ваш NSDocument так, чтобы он прикреплялся только к этому одноэлементному окну

Добавьте что-то подобное в ваш NSDocumentоснованный документ.По сути, вы скажете документу использовать имеющееся у вас одноэлементное окно, и внутренний setDocument внутри NSWindowController должен вызываться автоматически для замены любого существующего NSDocument, который он показывает.

- (void)makeWindowControllers {
    ReceiptDocumentWindowController *wc = [ReceiptDocumentWindowController singletonInstance];
    [self addWindowController:wc];
}

Рассмотрите возможность удаления NSDocument изNSWindowController при закрытии, просто чтобы убедиться, что он не торчит.Я не думаю, что это требуется в некоторых случаях, но вы можете также исследовать это.Итак, также в вашем документе NSDocument:

- (void)close {
    [self removeWindowController:[ReceiptDocumentWindowController singletonInstance]];
    [super close];
}

Test - теперь у вас должно быть работающее прототипное решение

С ним будет несколько проблем, и все они зависят от ваших точных требований,

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

Вернемся к тому NSViewController, о котором я говорил, и как обновить его «текущим открытым документом».Я добавил клей в NSWindowController для setDocument, чтобы прикрепить любой документ, который открывается, к моим нижестоящим экземплярам xib, связанным с IBOutlet (например, NSViewController).Хорошо, вот так:

- (void)setDocument:(NSDocument *)lDocument {
    [super setDocument:lDocument];
    if (lDocument != nil && self.receiptDetailViewController != nil)
        self.receiptDetailViewController.representedObject = lDocument;
}

Теперь представленный объект в моем NSDocumentViewController имеет представления, которые привязываются с помощью привязок какао к NSViewController.representedObject.Итак, бинго, это делает мои вещи почти волшебными.Я бы рекомендовал инкапсулировать таким образом, чтобы вы могли сосредоточиться на представлении документа с представлениями в xib и NSViewController, который теперь имеет ссылку на любой открываемый документ.

Если это недостаточно ясно, дай мне знать.Я выложу больше кода.Удачи, дайте мне знать, если это поможет.

Маркус Виллифорд

0 голосов
/ 19 февраля 2012

Вы сможете получить необходимый пользовательский интерфейс, создав новый проект Xcode на основе шаблона приложения Cocoa. Убедитесь, что вы сняли флажок «Создать приложение на основе документа».

Вам придется самостоятельно писать команды Open / Save и менять классы на NSDocument и друзей, но это должно быть выполнимо.

...