NSProgressBar startAnimation, вызываемая ИЗ действия ManiMenu

Первый вопрос в StackOverflow, а также в Cocoa newbye, и вдобавок я использую XCode 4 (будьте любезны, пожалуйста!)

Сценарий:

Простой NSPersistentDocument Многооконный: каждый документ имеет window.nib и прикрепленный WindowController. Приложение ВЫПОЛНЯЕТ NSTask (в фоновом режиме), когда я нажимаю кнопку на ПАНЕЛИ ИНСТРУМЕНТОВ ОКНА.

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

Образец кода:

NSButton -> IBAction -> метод в WindowController

- (IBAction)launchSim:(id)sender 
{
[simcell launchTask];
[progBar startAnimation:self];
   .... more code ...
}

Все работает красиво и отлично.

Теперь (как обычно в этом сценарии) вы получаете странную ошибку, и ваша работа становится непродуктивной:

Я решаю запустить то же действие также из MainMenu (из NSMenuItem):

В MainMenu.xib:

NSMenuItem ("RUN") -> FirstResponder -> Действие, определяемое пользователем в первом респонденте: launchSim (идентификатор типа)

Пункт меню RUN правильно запускает задачу (у меня есть сообщения NSLog DEBUG), НО анимация (startAnimation) progressBar не запускается!

РАЗНИЦА в 2 действиях:

  • первый (рабочий) вызывается из файла Nib, принадлежащего WindowController
  • второй (неработающий) вызывается из MainMenu.xib и отправляется в FirstResponder

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

Что мне не хватает?

Спасибо и всего наилучшего


person tucano    schedule 25.05.2011    source источник


Ответы (2)


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

Заставить элемент меню выполнить действие работает точно так же, как заставить кнопку выполнить действие:

  • Откройте файл пера.
  • Перейдите в меню и перейдите к пункту меню «Выполнить», который должен запускать действие.
  • Удерживая Ctrl, щелкните элемент меню и перетащите соединительную линию к контроллеру окна.
  • Когда вы отпустите перетаскивание, вы должны увидеть всплывающее меню. Нажмите launchSim: и все готово.
person puzzle    schedule 25.05.2011

Что ж, я отвечаю себе, потому что нахожу ошибку:

Это классическая структура для "продвинутого" NSPersistentDocument:

  1. один класс для документа
  2. один подкласс NSWindowController для управления представлением

это соответствует архитектуре MVC:

  • Модель: документ
  • Контроллер: прикреплен к окну
  • Вид: окно

Моя ошибка заключалась в том, чтобы СОЗДАТЬ NSObject в представлении и связать его с NSWindowController, в то время как правильный способ сделать это - установить ваш подкласс NSWindowController как владелец файла, а теперь волшебным образом, также запуск MainMenu анимация. Это как-то связано с цепочкой респондентов, но далеко от моих текущих знаний о Какао. Если кто может прокомментировать и объяснить ....

person tucano    schedule 27.05.2011