Програматично подія натискання кнопки?


126

Чи існує спосіб програмного запуску події натискання кнопки? У мене розміщена кнопка в UIView, і в конкретному сценарії я хочу натиснути кнопку за допомогою коду, а не вручну як користувача. Чи можливо це в розробці iOS? Надайте свої пропозиції та вкажіть, як це зробити.

Дякую.

Відповіді:


313

Начебто відповідь Кена, але більш гнучка, оскільки вона буде відслідковувати фактичні дії кнопок, якщо ви змінюєте їх або додаєте більше одного.

[button sendActionsForControlEvents:UIControlEventTouchUpInside];

8
Чи підкреслює це кнопка, якщо button.showsTouchWhenHighlighted = YESвона хотіла б мати фактичний штрих?
човен

2
Ця відповідь чудова b / c, її можна легко перекласти на інші елементи управління, такі як UISwitch (UIControlEventValueChanged), і в моєму випадку набагато краще, ніж викликати код цілі / дії безпосередньо b / c, я хочу, щоб комутатор перейшов! Дякую.
Джон Ерк

Ні, це не виділяє кнопку, якщо button.showsTouchWhenHighlight = ТАК. ; (
Richie Hyatt

7
якщо вам потрібна родзинка, ви можете це зробити. [кнопка встановлена ​​виділеною: ТАК]; [кнопка sendActionsForControlEvents: UIControlEventTouchUpInside]; [кнопка встановлена ​​підсвіченою: НІ]; і це чудово працює. -rrh
Richie Hyatt

Привіт @zaky, якщо я хочу лише анімацію, без надсилання дій, як це зробити?
Бенхі

13

У мене було те саме питання, що і вище. Я б опублікував коментар, але моя репутація недостатньо висока. Тож я замість цього опублікую повну відповідь:

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

Це програмно натисне на кнопку та виділить її, здавалося б, нормальну кількість часу. Пропозиція Річі не спрацювала, оскільки кнопка була виділена (якщо вона взагалі) лише непомітна кількість часу.


Це не було виділено, малювання відбувається лише після завершення виконання поточного фрагмента коду. Це приємне виправлення.
матцвен

6

Чому б не просто виконати код, який виконується, коли користувач натискає кнопку?

-(void)myMethod
{
   // do stuff
}

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

-(void)clickMyButton
{
    [self myMethod];
    // OR
    [self myButtonClick:nil];
}

Ні, моя вимога полягає не в тому, щоб викликати метод, як запускати кнопку події програмно, а не тоді, коли користувач натискає її вручну. Я створив UIButton програмно в UIView, я хочу автоматично запускати події натискання кнопки через певний проміжок часу через саму програму, а не користувачем.
Геци

Тоді це неможливо без синтезу дотику. Дивіться cocoawithlove.com/2008/10/… . Однак ви не можете подавати свою програму в App Store, використовуючи цей метод, оскільки він використовує приватний API. Зазвичай використовується для налагодження.
Еван Мулавський

Ви не пояснюєте, чому вам потрібно імітувати дотик проти просто виклику методу, але це далеко не найпростіший спосіб. Ваша дія таймера може викликати будь-який потрібний вам спосіб, а метод, який він викликає, може надіслати відгук в інтерфейсі про те, що кнопка натискається шляхом зміни стану кнопки (вибраного, виділеного тощо). Якщо це не вийде, так і буде.
XJones

1

Якщо ви говорите про UIButton, ви можете просто викликати той самий метод, який викликає UIButton при натисканні на нього. Наприклад:

[self myButtonsTargetMethod];

Ні, моя вимога полягає не в тому, щоб викликати метод, як запускати кнопку події програмно, а не тоді, коли користувач натискає її вручну. Я створив UIButton програмно в UIView, я хочу автоматично запускати події натискання кнопки через певний проміжок часу через саму програму, а не користувач
Геци

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 - це метод, який я створив.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.