Программно запускать событие нажатия кнопки?

126

Есть ли способ программно запустить событие нажатия кнопки? У меня есть кнопка, размещенная там в UIView, и в конкретном сценарии я хочу нажать кнопку с помощью кода, а не вручную как пользователь. Возможно ли это в разработке под iOS? Пожалуйста, поделитесь своими предложениями и объясните, как это сделать.

Спасибо.

Getsy
источник

Ответы:

314

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

[button sendActionsForControlEvents:UIControlEventTouchUpInside];
Заки Герман
источник
8
Подсвечивает ли это кнопку, button.showsTouchWhenHighlighted = YESкак будто это было бы касанием?
chown
2
Этот ответ отличный b / c, его можно легко перевести на другие элементы управления, такие как UISwitch (UIControlEventValueChanged), и в моем случае это намного лучше, чем вызов целевого кода / кода действия напрямую b / c Я хочу, чтобы переключатель переключился! Спасибо.
Джон Эрк
Нет, кнопка не выделяется, если button.showsTouchWhenHighlighted = YES. ; (
Ричи Хаятт
7
если вам нужна подсветка, вы можете это сделать. [набор кнопок выделен: ДА]; [кнопка sendActionsForControlEvents: UIControlEventTouchUpInside]; [набор кнопок выделен: НЕТ]; и он отлично работает. -rrh
Richie Hyatt
Привет @zaky, если мне нужна только анимация, без действия отправки, как я могу это сделать?
Benhi
13

У меня была та же проблема, что и выше. Я бы написал комментарий, но моя репутация недостаточно высока. Поэтому я отправлю полный ответ:

[btn setHighlighted:YES];
[btn sendActionsForControlEvents:UIControlEventTouchUpInside];
[btn performSelector:@selector(setHighlighted:) withObject:NO afterDelay:0.25];

Это приведет к программному нажатию кнопки и ее выделению на кажущийся нормальный промежуток времени. Предложение Ричи не сработало, поскольку кнопка была подсвечена (если вообще) на незаметное время.

Чад Хайн
источник
Он не был выделен, отрисовка выполняется только после завершения выполнения текущего фрагмента кода. Это хорошее исправление.
mattsven
6

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

-(void)myMethod
{
   // do stuff
}

-(IBAction)myButtonClick:(id)sender
{
    [self myMethod];
}

-(void)clickMyButton
{
    [self myMethod];
    // OR
    [self myButtonClick:nil];
}
Эван Мулавски
источник
Нет, мое требование не вызывает метод, как запускать событие нажатия кнопки программно, а не когда пользователь щелкает его вручную. Я создал UIButton программно в UIView, я хочу, чтобы событие нажатия кнопки запускалось автоматически через определенный интервал времени через саму программу, а не пользователем.
Getsy
Тогда это невозможно без синтеза прикосновения. См. Cocoawithlove.com/2008/10/… . Однако вы не можете отправить свое приложение в App Store с помощью этого метода, поскольку он использует частный API. Обычно он используется для отладки.
Эван Мулавски
Вы не объясняете, почему вам нужно имитировать прикосновение, а не просто вызвать метод, но это, безусловно, самый простой способ. Действие таймера может вызывать любой метод, который вы хотите, и метод, который он вызывает, может сообщать в пользовательском интерфейсе, что кнопка нажата, путем изменения состояния кнопки (выбрано, выделено и т. Д.). Если это не сработает, пусть будет так.
XJones
1

Если вы говорите о UIButton, вы можете просто вызвать тот же метод, который UIButton вызывает при нажатии. Например:

[self myButtonsTargetMethod];
Кен Песписа
источник
Нет, мое требование не вызывает метод, как запускать событие нажатия кнопки программно, а не когда пользователь щелкает его вручную. Я создал UIButton программно в UIView, я хочу, чтобы событие нажатия кнопки запускалось автоматически через определенный интервал времени через саму программу, а не пользователем.
Getsy
1

Да,

[_button setHighlighted:YES];
[_button sendActionsForControlEvents:UIControlEventTouchUpInside];
[_button setHighlighted:NO];

Но проблема в том, что вы не сможете увидеть это событие, потому что оно слишком быстрое. так что вы можете попробовать приведенный выше код с NSTimer.

NSTimer *quick = [NSTimer scheduledTimerWithTimeInterval:2.5 target:self selector:@selector(MeFirst:) userInfo:nil repeats:NO];

MeFirst - это метод, который я создал.

Бхарат Джайн
источник