2010-05-13 5 views
1

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

Все работает, как ожидалось ... с тремя оговорками:

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

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

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

+0

Возможно, кто-то еще сможет ответить на этот вопрос, но он будет (и всегда) полезен, если вы сможете создать и опубликовать пример приложения, демонстрирующего проблему. – ericg

+0

Я бы хотел, но я не думаю, что сам код был бы уместным. Соответствующая часть интерфейса - это нить (поэтому нет кода), и приложение использует рамки документа Cocoa для выполнения своей работы, поэтому само приложение имеет относительно небольшой код. – mipadi

ответ

0

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

Это то, что мы сделали в Adium Xtras Creator. Этот код находится под a BSD license (в отличие от собственно Адиума), поэтому вы можете одолжить его, если хотите.

+0

Исправлена ​​первая проблема, а вторая - новые или открытые окна документа не фокусируются на создании - все еще существует. Любые идеи, которые могут вызывать эту проблему? – mipadi

+0

Нет. У Adium Xtras Creator нет этой проблемы. Являются ли новые окна не ключевыми, а не главными или нет? –

0

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

Что-то вроде этого:

- (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]; 
} 
+0

Это работает, за исключением элемента # 2: Окно документа не имеет фокуса, когда оно появляется.Любые идеи о том, как это сделать? – mipadi

+0

Попробуйте вызвать метод '-newDocument' в следующем цикле событий:' [[NSDocumentController sharedDocumentController] выполнитьSelector: @selector (newDocument :) withObject: sender afterDelay: 0]; ' –

+0

Хм, это тоже не сработало. – mipadi

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