Извините за поздний ответ. MessageView
уже предоставляет buttonTapHandler
обратный вызов для вас:
/// An optional button tap handler. The `button` is automatically
/// configured to call this tap handler on `.TouchUpInside`.
open var buttonTapHandler: ((_ button: UIButton) -> Void)?
@objc func buttonTapped(_ button: UIButton) {
buttonTapHandler?(button)
}
/// An optional button. This buttons' `.TouchUpInside` event will automatically
/// invoke the optional `buttonTapHandler`, but its fine to add other target
/// action handlers can be added.
@IBOutlet open var button: UIButton? {
didSet {
if let old = oldValue {
old.removeTarget(self, action: #selector(MessageView.buttonTapped(_:)), for: .touchUpInside)
}
if let button = button {
button.addTarget(self, action: #selector(MessageView.buttonTapped(_:)), for: .touchUpInside)
}
}
}
, который автоматически вызывается для любой кнопки, подключенной к розетке button
. Поэтому рекомендуемый метод представления другого контроллера представления состоит в том, чтобы заставить контроллер представления настроить логику представления в этом обратном вызове:
messageView.tapHandler = { [weak self] in
guard let strongSelf = self else { return }
let storyBoard: UIStoryboard = UIStoryboard(name: "Main", bundle: nil)
let newViewController = storyBoard.instantiateViewController(withIdentifier: "newViewController") as! NewViewController
strongSelf.present(newViewController, animated: true, completion: nil)
}
Если ваше представление имеет более одной кнопки, вы можете обработать их все через buttonTapHandler
, поскольку он принимает аргумент button
. Вам просто нужно настроить механизм целевого действия для каждой кнопки:
otherButton.addTarget(self, action: #selector(MessageView.buttonTapped(_:)), for: .touchUpInside)
Или вы можете добавить один обратный вызов для каждой кнопки, продублировав вышеуказанный шаблон.