Как программно подделывать событие касания к UIButton?

Я пишу некоторые модульные тесты, и, учитывая характер этого конкретного приложения, важно, чтобы я поднялся как можно выше по цепочке UI. Итак, что я хотел бы сделать, это программно вызвать нажатие кнопки, как если бы пользователь нажал кнопку в GUI.

(Да, да - я мог бы просто вызвать селектор IBAction, но, опять же, характер этого конкретного приложения делает важным, чтобы я имитировал фактическое нажатие кнопки, чтобы IBAction вызывался из самой кнопки.)

Какой предпочтительный способ сделать это?

Ответ 1

Оказывается, что

[buttonObj sendActionsForControlEvents: UIControlEventTouchUpInside];

получил именно то, что мне было нужно, в этом случае.

EDIT: Не забудьте сделать это в основном потоке, чтобы получить результаты, похожие на пользовательские нажатия.


Для Swift 3:

buttonObj.sendActions(for: .touchUpInside)

Ответ 2

Обновление для этого ответа для Swift

buttonObj.sendActionsForControlEvents(.TouchUpInside)

EDIT: обновлено для Swift 3

buttonObj.sendActions(for: .touchUpInside)

Ответ 3

Если вы хотите провести такое тестирование, вам понравится поддержка автоматизации пользовательского интерфейса в iOS 4. Вы можете писать JavaScript для имитации нажатия кнопок и т.д. довольно легко, хотя документация (особенно часть, начатая с запуском) - это бит разреженный.

Ответ 4

В этом случае UIButton выводится из UIControl. Это работает для объекта, полученного из UIControl.

Я хотел повторно использовать действие "UIBarButtonItem" в конкретном случае использования. Здесь UIBarButtonItem не предлагает метод sendActionsForControlEvents:

Но, к счастью, UIBarButtonItem имеет свойства для цели и действия.

 if(notHappy){        
         SEL exit = self.navigationItem.rightBarButtonItem.action;
         id  world = self.navigationItem.rightBarButtonItem.target;
         [world performSelector:exit];
 }

Здесь rightBarButtonItem имеет тип UIBarButtonItem.

Ответ 5

Swift 3:

self.btn.sendActions(for: .touchUpInside)

Ответ 6

Для Xamarin iOS

btnObj.SendActionForControlEvents(UIControlEvent.TouchUpInside);

Ссылка

Ответ 7

Swift 4:

self.yourButton(self)