Могу ли я добавить несколько целевых действий в UIButton для одного и того же события, как показано ниже?
[button addTarget:self action:@selector(xxx) forControlEvents:UIControlEventTouchUpInside];
[button addTarget:object action:@selector(yyy) forControlEvents:UIControlEventTouchUpInside];
Я сделал быстрое приложение, чтобы проверить его, и оно выполняет оба действия при нажатии кнопки.
Я хочу знать, является ли это хорошей практикой, а также будет ли порядок выполнения всегда оставаться прежним?
Заранее спасибо.
Редактировать: я нашел этот сообщение, в котором говорится, что он вызывается в обратном порядке добавления, т. Е. Последняя добавленная цель вызывается первой. Но это не подтверждено
Если важен порядок, используйте один обработчик действий и в этом обработчике выполняйте задачи в нужном порядке.
@bsod, это отличное решение, и я уже думал об этом, но как мне передать цель (кроме self
) и селектор обработчику действия?
Да, к кнопке можно добавить несколько действий.
лично я бы предпочел, чтобы делегат подписался на кнопку.
Пусть object
, которого вы хотите добавить как target
, подпишется на метод делегата, чтобы он мог получать события, когда вы нажимаете кнопку.
или
Одно действие, которое перенаправляет событие другим методам для полного контроля
Простой тест в Swift
import UIKit
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view.
let button = UIButton(frame: CGRect(x: 50, y: 50, width: 300, height: 30))
button.backgroundColor = .orange
button.addTarget(self, action: #selector(action1), for: .touchUpInside)
button.addTarget(self, action: #selector(action2), for: .touchUpInside)
button.addTarget(self, action: #selector(actionHandler), for: .touchUpInside)
self.view.addSubview(button)
}
@objc func actionHandler(_ sender: UIButton){
print("actionHandler")
action1(sender)
action2(sender)
}
@objc func action1(_ sender: UIButton) {
print("action1")
}
@objc func action2(_ sender: UIButton) {
print("action2 \n")
}
}
Вывод после одного клика:
action1
action2
actionHandler
action1
action2
Can you confirm on the order of execution when normally adding the actions
Да, он выполняется в том порядке, в котором вы устанавливаете цели.
Спасибо за Ваш ответ. Я могу добавить несколько действий к кнопке для одного и того же события. Я больше склоняюсь к тому, чтобы знать порядок вызова и является ли это хорошей практикой.
Вы обязательно должны рассмотреть использование делегата. я обновил ответ
спасибо за обновление. Можете ли вы подтвердить порядок выполнения при обычном добавлении действий?
Да, он выполняется в том порядке, в котором вы устанавливаете цели. Обновил ответ еще раз.
Является ли это «хорошей практикой», в значительной степени основано на мнении. В документации нет претензий к заказу, поэтому я бы не стал рассчитывать на заказ. На самом деле, я бы предположил, что порядок выполнения является случайным.