В каком порядке срабатывают два IBActions при вызове из одного компонента?

У меня есть UIButton, и я пытаюсь вызвать 2 разных действия из одного события UIButton, так как эта кнопка должна делать две вещи, но мне нужно делать их в определенном порядке.

Как бы я ни пытался, я не могу изменить порядок, в котором срабатывают действия. Есть ли способ для меня решить это, или это случайно?

В каком порядке IBActions запускаются из одного и того же компонента? Есть ли способ вызвать их в определенном порядке?


person Dummy Code    schedule 06.06.2013    source источник


Ответы (3)


Почему бы не создать один новый метод, который вызывается кнопкой и запускает ваши существующие методы именно так, как вы хотите?

person Alex    schedule 06.06.2013
comment
Это могут быть действия на двух разных NSObjects в сцене. - person Aaron Frary; 23.01.2018

Ответ на это довольно прост, как бы это ни было немного странно. IBActions вызываются в алфавитном порядке. См. пример ниже.

Ниже приведены 6 методов IBAction, каждый из которых распечатывает, какой это метод.

В файле .h...

- (IBAction)a:(id)sender;
- (IBAction)b:(id)sender;
- (IBAction)c:(id)sender;
- (IBAction)d:(id)sender;

А в файле .m...

- (IBAction)a:(id)sender {
   NSLog(@"a");
}
- (IBAction)b:(id)sender {
   NSLog(@"b");
}
- (IBAction)c:(id)sender {
   NSLog(@"c");
}
- (IBAction)d:(id)sender {
   NSLog(@"d");
}

Когда я нажимаю на кнопку, связанную со всем этим, я получаю следующий журнал...

2013-06-05 18:06:52.637 TestIBAction[49798:c07] a
2013-06-05 18:06:52.637 TestIBAction[49798:c07] b
2013-06-05 18:06:52.637 TestIBAction[49798:c07] c
2013-06-05 18:06:52.637 TestIBAction[49798:c07] d

Если вы посмотрите на них в алфавитном порядке, они будут запущены следующим образом; a, b, b, d, e, f создание показанного журнала. Даже если вы переупорядочиваете IBActions или связываете их по-разному, создается один и тот же журнал.

Простой ответ на эту проблему состоит в том, чтобы добавить буквы перед именами ваших методов, такими как aOne, bTwo, cThree, и тогда они будут вызываться в этом порядке, тогда как, если вы оставите их One, Two, Three, они будут вызываться как one, three, two из-за этого алфавитного порядка.

Надеюсь, это поможет людям. Это поставило меня в тупик на самое долгое время.

person Dummy Code    schedule 06.06.2013
comment
Круто, не знал этого! Тем не менее, я думаю, что ответ Алекса выше - это то, что вам нужно! - person Groot; 06.06.2013
comment
@Filip Да, я действительно считаю, что это был бы лучший способ, однако мне захотелось поделиться тем, что я узнал сегодня. :) - person Dummy Code; 06.06.2013
comment
Хотя это интересное открытие, пожалуйста, не полагайтесь на него. Это недокументированная деталь реализации, которая может измениться. - person rmaddy; 06.06.2013

Порядок не определен, и вы не должны полагаться на порядок, так как он может измениться в будущем обновлении ОС.

person darrensi    schedule 06.06.2013
comment
@HenryHarris Это не так. Тот факт, что текущая реализация вызывает селекторы в алфавитном порядке, не означает, что вы должны полагаться на это поведение. Это не задокументировано и может измениться, как и сказал Дарренси. Никогда не полагайтесь на недокументированные детали реализации. - person rmaddy; 06.06.2013
comment
Это не ответ и не полезно. - person davidrayowens; 18.04.2014