Быстрые параметры передачи в вызовах #selector - PullRequest
0 голосов
/ 29 октября 2019

Подводя итог моей проблеме: у меня есть большой стол с большим количеством сообщений от разных людей. И я просматриваю свой список ячеек таблицы с источником данных таблицы, как в следующем примере. И я хочу дать каждому текстовой метке ячейки прослушиватель щелчков. Итак, я придумал это здесь, в моем cellForRowAt, в источнике данных моих таблиц:

    let tap = UITapGestureRecognizer(target: self, action: #selector(clickedOnLabel(sender:, content: local[indexPath.row][2],rank: rank)))
    cell.textLabel?.isUserInteractionEnabled = true
    cell.addGestureRecognizer(tap)

Поэтому я хочу добавить эту функцию щелчка прямо здесь, которая нуждается в содержании аргументов и ранжировании с ним:

@objc func clickedOnLabel(sender: UITapGestureRecognizer, content: String, rank: Int){

    //Do some stuff here

}

Но мне не разрешено передавать контент и ранжировать с помощью селектора, когда я ставлю контент и ранжирую, все работает нормально ... Так это просто синтаксис?

Ответы [ 2 ]

0 голосов
/ 29 октября 2019

Вот решение с использованием делегата:

В вашей пользовательской ячейке

protocol MyCustomCellDelegate{
    func didTapOnLabel(content: String, rank: Int)
}

var delegate: MyCustomCellDelegate?

Когда произойдет нажатие, вызовите

self.delegate?.didTapOnLabel(content: "my content", rank: 100)

В вашей функции CellForRowAt

cell.delegate = self

и соответствуют делегату:

extension YouViewController: MyCustomCellDelegate{
    func didTapOnLabel(content: String, rank: Int){
        // do your stuff
    }
}
0 голосов
/ 29 октября 2019

Вот небольшой пример того, как вы можете достичь этого с помощью замыканий.

cell.updateParent = { [weak self] score, rank in
    // Do magic here
}

И в своем классе ячеек вы должны добавить что-то вроде

var updateParent: ((Double, Int) -> Void)?

@IBAction func doMagicInParent(_ sender: Any) {
    updateParent?(score, rank)
}

Этого можно достичьс помощью делегатов, а также. Или вы также можете передать данные через центр уведомлений.

Пример центра уведомлений

Пример делегата

...