Нажмите на ImageView и выполните функцию БЕЗ селекторов в Swift / Xcode - PullRequest
0 голосов
/ 07 января 2020

У меня есть tableView с ячейками. Каждая ячейка имеет imageView. Когда я нажимаю на imageView, я хочу выполнить функцию с параметрами, которые я передаю. Единственный способ, которым я знаю, как работать с нажатием на imageViews, это что-то вроде этого:

let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(printNumber))
cell.imageView.addGestureRecognizer(gestureRecognizer)

@objc func printNumber(){
        print("4")
}

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

Я хочу сделать что-то подобное ( Я знаю Вы не можете сделать это)

let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(printNumber(num: 4))
cell.imageView.addGestureRecognizer(gestureRecognizer)

@objc func printNumber(String: num){
        print(num)
}

Мне нужно это делать, потому что каждый кнопка будет иметь другой выход при нажатии, в зависимости от некоторых других переменных в ячейке.

Ответы [ 2 ]

0 голосов
/ 07 января 2020

Используйте свойство accessibilityIdentifier , , только если вы все еще хотите использовать #selector, чтобы UIGestureRecognizer мог прочитать значение объекта значения.

 func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! YourTableViewCell
    …
    let gestureRecognizer = UITapGestureRecognizer(target: self, action: #selector(printNumber))
    cell.imageView.accessibilityValue = String(4)
    cell. imageView.isUserInteractionEnabled = true
    cell.imageView.addGestureRecognizer(gestureRecognizer)
    …
    return cell
 }

 @objc func printNumber(sender: UITapGestureRecognizer) {
        if let id = sender.view?.accessibilityIdentifier {
            print(tag)
        }
 }
0 голосов
/ 07 января 2020

Вам не нужно указывать номер. Предполагая, что распознаватель находится в представлении изображения, вы:

  1. Получите gestures.view (это представление изображения)
  2. Пройдите вверх по цепочке респондента, чтобы найти родительскую ячейку и таблицу просмотра таблицы. view
  3. Запросить в табличном представлении путь индекса ячейки табличного представления (в основном это номер, который вы хотите передать)
  4. Вызовите вашу функцию с номером

Что касается общего перехода по цепочке респондента:

extension UIResponder {
    func firstParent<Responder: UIResponder>(ofType type: Responder.Type ) -> Responder? {
        next as? Responder ?? next.flatMap { $0.firstParent(ofType: type) }
    }
}

, поэтому ваш код:

  guard let cell = recognizer.view?.firstParent(ofType: UITableViewCell.self),
     let tableView = recognizer.view?.firstParent(ofType: UITableView.self),
     let indexPath = tableview.indexPath(for: cell) else {
    return
  }
  // Do stuff with indexPath here
...