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