Как удалить NSPanel при создании или открытии нового документа? - PullRequest
1 голос
/ 13 мая 2010

Я работаю над документным приложением Какао. При запуске пользователю предоставляется «панель приветствия» (типа NSPanel) с кнопками для общих действий, таких как «Создать новый документ» и «Открыть существующий документ». Эти действия связаны с действиями newDocument: и openDocument: первого респондента соответственно, как и соответствующие элементы в меню Файл.

Все работает как положено ... с тремя оговорками:

  1. Панель приветствия не закрывается при создании или открытии нового документа.
  2. Окна документов не имеют фокуса при создании.
  3. Открытые окна документа не имеют открытого файла, представленного в строке заголовка окна; аналогично, новые окна документов не создаются с такими заголовками, как «Без названия», «Без названия 2», «Без названия 3» и т. д., как и ожидалось. (Я упоминаю об этом не только потому, что это раздражает, но и потому, что это может дать некоторое представление о том, что происходит не так.)

Я частично решил # 1, сделав свой контроллер приложения делегатом панели приветствия. При нажатии кнопки «Открыть существующий документ» панель меняет свой статус ключа (поскольку открывается диалоговое окно браузера файлов), поэтому я могу закрыть панель в методе windowDidResignKey: делегата. Однако я не могу понять, как закрыть панель при создании нового документа, поскольку не могу найти опубликованное уведомление или вызываемый метод делегата при создании нового документа. И, в конечном итоге, проблема №2 все еще остается проблемой, поскольку окна документов не получают фокус при создании.

У меня есть только подклассы NSDocument - я вообще не использую пользовательский документ или оконный контроллер. Я также попытался изменить панель на NSWindow, думая, что NSWindow может вести себя по-разному, но возникают те же проблемы.

Ответы [ 2 ]

0 голосов
/ 14 мая 2010

Создайте пользовательский контроллер документов, и он узнает о контроллере панели «Начальные точки», скроет окно в addDocument: и покажет его снова (если не осталось других документов) в removeDocument:.

Это то, что мы сделали в Adium Xtras Creator . Этот код под лицензией BSD (в отличие от самого Adium), поэтому вы можете заимствовать его, если хотите.

0 голосов
/ 14 мая 2010

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

Примерно так:

- (IBAction)createNewDocument:(id)sender
{
    //this will close the window if you're using NSWindowController
    [self close];
    [[NSDocumentController sharedDocumentController] newDocument:sender];
}

Или, если вы не используете NSWindowController в качестве окна приветствия, вы можете просто отправить это сообщение напрямую:

- (IBAction)createNewDocument:(id)sender
{
    //assume you have a "window" outlet connected to your welcome window
    [window orderOut:sender];
    [[NSDocumentController sharedDocumentController] newDocument:sender];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...