Как добавить сенсорное событие для пользовательского пользовательского интерфейса и контроллера?

У меня есть собственный UIControl с тремя подвидами. Каждому из этих подпредставлений я добавляю цель:

button.addTarget(self, action: #selector(buttonTapped(clickedBtn:)), for: .touchUpInside)

Внутри этой функции buttonTapped она выполняет некоторые специальные анимации для некоторых переходов (она имитирует сегментированный элемент управления).

Теперь внутри ViewController, в котором существует этот пользовательский UIControl, должен знать, когда к нему прикоснулись. Я создал функцию @IBAction, которая взаимодействует с сенсорными событиями для пользовательского UIControl.

Проблема в том, что это невозможно (насколько я знаю). Если я добавлю целевое событие касания в подпредставления, родительские события касания не будут вызываться. Чтобы родительское представление вызывало функцию @IBAction, я должен установить для всех подпредставлений setUserInteractiveEnabledtotrue`. Когда я это сделаю, функции сенсорного события подпредставления не будут вызываться.

Мне нужно вызвать обе функции сенсорного события. Как я могу это сделать? Или как лучше обойти это?


person Rob Avery IV    schedule 10.09.2017    source источник
comment
Можно ли сделать так, чтобы весь настраиваемый элемент управления был IBAction, а затем в .touchUpInside определить, какое подпредставление было нажато?   -  person dfd    schedule 11.09.2017


Ответы (1)


Используйте делегатов, добавьте протокол в свой UIControl, который необходимо реализовать в вашем ViewController.

Таким образом, вы можете определить, была ли нажата кнопка в вашем UIControl, и вызвать определенную функцию в вашем VC.

Например:

//YourUIControl.Swift
protocol YourUIControlDelegate {
  func didTapFirstButton()
}

class YourUiControl : UIView { //I'm assuming you create your UIControl from UIView

  var delegate : YourUIControlDelegate?
  //other codes here
  .
  .
  .
  @IBAction func tapFirstButton(_ sender: AnyObject) {
     if let d = self.delegate {
       d.didTapFirstButton()
     }
  }
}

//YourViewController.Swift
extension YourViewController : UIControlDelegate {
  func didTapFirstButton() {
     //handle first button tap here
  }
}
person Ace Rivera    schedule 11.09.2017
comment
Это сработало! Единственное, что мне нужно было добавить, это в YourViewController, в viewDidLoad вам нужно установить делегат YourUIControl на себя. - person Rob Avery IV; 12.09.2017