Objective-C не выполняет метод изменения для NSPopUpButton

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

- (IBAction)popUpChanged:(id)sender
{
    self.item = [sender selectedTag];
}

Если я выбираю пункт/элемент меню, выполняется метод popUpChanged.

В другом классе у меня есть кнопка. Нажав эту кнопку, всплывающее меню контроллера представления должно быть установлено на пункт №. 1. Поэтому действие кнопки выполняет следующую строку.

[_viewController.popUp selectItemWithTag: 1];

После выполнения selectItemWithTag:1 всплывающее меню устанавливается на элемент 1, как и ожидалось. Состояние/пункт всплывающего меню изменяется, но нажатие кнопки не приводит к выполнению метода popUpChanged?

Может кто-нибудь объяснить мне, почему метод popUpChanged не выполняется?


person 3ef9g    schedule 29.08.2014    source источник


Ответы (1)


-popUpChanged: — это то, что вы установили в качестве метода действия для всплывающего меню. Программное изменение всплывающего меню не является «действием» в этом всплывающем меню. Действие запускается только при взаимодействии пользователя со всплывающим меню.

В Cocoa довольно распространена практика, согласно которой программные операции над элементами управления не проходят по тем же путям, что и пользовательские манипуляции с этими элементами управления. Например, элемент управления можно отключить, чтобы пользователь не мог его изменить, но вы все равно можете изменить его программно. Или делегат окна может предотвратить закрытие окна в его -windowShouldClose:, но программное закрытие окна с -close не подлежит этому (хотя -performClose: есть).

В любом случае, учитывая, что вы программно изменяете выбранный элемент во всплывающем меню, вы можете программно вызвать метод действия или, что чаще, выполнять ту же операцию, что и метод действия (например, [_viewController.popUp selectItemWithTag: 1]; _viewController.item = 1;).

Или, что еще лучше, привяжите привязку selectedTag кнопки всплывающего окна к свойству item контроллера представления и а) исключите метод действия и б) замените программные манипуляции с всплывающим окном программной настройкой свойства item контроллера представления.

person Ken Thomases    schedule 29.08.2014
comment
Хорошо, понял, спасибо. Но разве нет возможности выполнить нажатие кнопки другим методом (как в других языках программирования)? А что вы подразумеваете под _viewController.item=1;? В моем _viewController нет элемента - person 3ef9g; 01.09.2014
comment
Вы сказали, что в контроллере представления я реализовал метод… а затем вы показали метод -popUpChanged:, который присваивается self.item. Это означает, что контроллер представления имеет свойство item. Что касается того, нет ли возможности выполнить нажатие кнопки с помощью другого метода? Мой вопрос будет в том, почему? Это ужасная идея. Вы можете попробовать вызвать -performClick: на всплывающей кнопке, но я не уверен, что именно она будет делать (поскольку один щелчок по всплывающей кнопке не вызывает ее действия). - person Ken Thomases; 01.09.2014