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

#objective-c #cocoa #interface-builder #appkit #nsprogressindicator

#objective-c #cocoa #конструктор интерфейса #appkit #nsprogressindicator

Вопрос:

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

Сценарий:

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

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

Пример кода:

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

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

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

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

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

В MainMenu.xib:

NSMenuItem («ВЫПОЛНИТЬ») -> Первый ответчик -> Определяемое пользователем действие в первом ответчике: launchSim (идентификатор типа)

Пункт меню «ВЫПОЛНИТЬ» корректно запускает задачу (у меня есть сообщения отладки NSLog), НО анимация (startAnimation) панели выполнения не запускается!

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

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

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

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

Спасибо и с наилучшими пожеланиями

Ответ №1:

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

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

  • Откройте файл nib.
  • Перейдите в меню и перейдите к пункту меню «Выполнить», который должен инициировать действие.
  • Щелкните Ctrl на пункте меню и перетащите соединительную линию к контроллеру окна.
  • Когда вы отпустите перетаскивание, вы должны увидеть всплывающее меню. Нажмите launchSim: и все должно быть готово.

Ответ №2:

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

Структура является классической структурой для «продвинутого» NSPersistentDocument:

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

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

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

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