Как получить события UIButton Target, Action и Control?

Я использую UIImageView с UIButtons целую кучу. Итак, я создал собственный класс, чтобы навсегда жениться на этих двух, чтобы сделать вещи немного проще. Все работает хорошо, пока я не решил реализовать -(id)initWithObject:(AUIImageViewButton *) imageViewButton.

Ясно, что мне нужно скопировать все соответствующие свойства из передаваемого объекта imageViewButton. UIImageView не является проблематичным вообще. Нечто подобное имеет дело с этим:

imageview = [[UIImageView alloc] initWithFrame:imageViewButton.imageview.frame];        // Copy all relevant data from the source's imageview
[imagebutton.imageview setBackgroundColor:imageViewButton.imageview.backgroundColor];   //
[imagebutton.imageview setImage:imageViewButton.imageview.image];                       //

Большая часть кнопок также доступна:

button = [UIButton buttonWithType:imageViewButton.button.buttonType];                   // Copy all relevant data from the source's button
button.frame = imageViewButton.imageview.frame;                                         // 
[button setTitle:imageViewButton.button.titleLabel.text forState:UIControlStateNormal]; //
button.tag = imageViewButton.button.tag;                                                //

У меня возникли небольшие проблемы с выяснением, как получить все данные для метода addTarget:action:forControlEvents.

Глядя на документы, я вижу, что могу использовать методы allControlEvents и allTargets в UIControl. Я сейчас покопаюсь в этом и посмотрю, сколько неприятностей я могу получить. В чем я не уверен, так это в действии.

Кто-нибудь может дать мне толчок в правильном направлении?

Спасибо,

-Мартин

3 ответа

Решение

UIControl-х allTargets а также allControlEvents способ начать. Последний кусок головоломки actionsForTarget:forControlEvent:Назовите это один раз для каждой цели и события.

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

for (id target in button.allTargets) {
     NSArray *actions = [button actionsForTarget:target
                                      forControlEvent:UIControlEventTouchUpInside];
     for (NSString *action in actions) {
          [newButton addTarget:target action:NSSelectorFromString(action) forControlEvents:UIControlEventTouchUpInside];
     }
}

Я использовал это, чтобы удалить любую возможную нежелательную цель / действие перед назначением новой:

if let action = button.actions(forTarget: target, forControlEvent: .touchUpInside)?.first
{
    button.removeTarget(target, action: NSSelectorFromString(action), for: .touchUpInside)
}

или если вы действительно хотите удалить все действия:

if let actions = button.actions(forTarget: target, forControlEvent: .touchUpInside)
{
    for action in actions
    {
        button.removeTarget(target, action: NSSelectorFromString(action), for: .touchUpInside)
    }
}
Другие вопросы по тегам