В каких порядках запускаются IBActions, когда для одного и того же события предоставляется несколько IBActions - PullRequest
1 голос
/ 18 ноября 2011

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

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

Когда я щелкаю правой кнопкой мыши по кнопке UIB в Интерфейсном Разработчике, я вижу, что оба Действия добавляются к одному и тому же событию, но независимо от того, в каком порядке они появляются, изменяется порядок запуска.

Надеюсь, что некоторые из вас могут мне помочь.

Ответы [ 3 ]

2 голосов
/ 18 ноября 2011

UIButtons - это подклассы UIControl, которые используют шаблон target-action для передачи событий. Программный интерфейс для добавления целей предоставляется методом addTarget:action:forControlEvents:. Подключение IBActions в конструкторе интерфейсов - это просто визуальный способ использования этого интерфейса; загрузчик пакетов вызовет этот метод на неархивированной кнопке при загрузке .xib-файла, который его содержит.

Ключевым моментом является то, что аргумент target в этом методе добавляется в NSSet (или изменяемый подкласс) внутри UIControl. NSSets по определению неупорядочены. Это означает, что когда кнопке необходимо перечислить свой набор целей для отправки событий, порядок перечисления не является четко определенным.

2 голосов
/ 19 марта 2012

Вы не получите ответ на этот вопрос ни в одной книге или даже в поиске.

Я пробовал это лично, и он работает в алфавитном порядке в соответствии с именами IBActions. Странно, но это факт !!

Тестовый пример ниже:

helloworld.h

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

Действие) г: (идентификатор) отправителя;

**HelloWorld.m file**

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

Теперь свяжите эти действия с вашей кнопкой в ​​событии [Touch Up Inside] в любом порядке. Вы найдете такой же вывод, как показано ниже:

выход

2012-03-19 15:35:34.548  I clicked a
2012-03-19 15:35:34.554  I clicked b
2012-03-19 15:35:34.564  I clicked c
2012-03-19 15:35:34.566  I clicked d
2012-03-19 15:35:34.568  I clicked e
2012-03-19 15:35:34.572  I clicked f

Ура !!

Счастливое кодирование !!

0 голосов
/ 18 ноября 2011

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

- (IBAction)doFooAndBar:(id)sender
{
    [self foo:sender];
    [self bar:sender];
}
...