У меня есть коллекция представлений, и я хочу сделать так, чтобы при их нажатии выполнялся один и тот же переход. и ни один вид не выполняет никакого перехода.
class ViewController: UIViewController {
@IBOutlet var categoryViews: [UIView]!
let tapGesture = UIGestureRecognizer(target: self, action: #selector(ViewController.move(tap:)))
override func viewDidLoad() {
super.viewDidLoad()
for category in (0..<categoryViews.count) {
categoryViews[category].addGestureRecognizer(tapGesture)
categoryViews[category].isUserInteractionEnabled = true
}
// Do any additional setup after loading the view.
}
@objc func move(tap: UIGestureRecognizer) {
performSegue(withIdentifier: "Animals", sender: nil)
}
}





Один экземпляр UITapGestureRecognizer можно добавить к одному представлению.
В вашем коде, поскольку вы используете один экземпляр UITapGestureRecognizer для каждого представления, tapGesture будет добавлен только к последнему view в categoryViewsarray.
Вам нужно создать отдельный экземпляр UITapGestureRecognizer для каждого view в categoryViews, т.е.
class ViewController: UIViewController {
@IBOutlet var categoryViews: [UIView]!
override func viewDidLoad() {
super.viewDidLoad()
categoryViews.forEach {
let tapGesture = UITapGestureRecognizer(target: self, action: #selector(move(tap:)))
$0.addGestureRecognizer(tapGesture)
$0.isUserInteractionEnabled = true
}
}
@objc func move(tap: UITapGestureRecognizer) {
performSegue(withIdentifier: "Animals", sender: nil)
}
}
Проблема в том, что этот код делает не то, что вы думаете:
class ViewController: UIViewController {
let tapGesture = UIGestureRecognizer(target: self, action: #selector(ViewController.move(tap:)))
Ваш let tapGesture является объявлением свойства экземпляра, а то, что следует за знаком равенства, является его инициализатором. Но вы не можете говорить о self в инициализаторе свойства экземпляра; экземпляра еще нет. Итак, self здесь принимается за сорт. Таким образом, ваш распознаватель жестов касания «работает», но сообщение move не отправляется в ваш экземпляр ViewController; по сути, он отправляется в пустое пространство.
Чтобы исправить это, вы можете инициализировать tapGesture в то время, когда self существует. Например:
class ViewController: UIViewController {
let tapGesture : UIGestureRecognizer!
func viewDidLoad() {
self.tapGesture = UITapGestureRecognizer(target: self, action: #selector(ViewController.move(tap:)))