Подтвердить что ты не робот

Получите IndexPath из подкласса UITableViewCell в Swift

У меня есть пользовательский подкласс UITableViewCell и связанный с ним xib. У меня есть UILabel и UIButton в этой ячейке, и я подключил внутреннее действие кнопки к подклассу.

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

Так как я внутри подкласса UITableViewCell, я не могу использовать такое решение, как this, потому что у меня нет ссылки на представление таблицы внутри подкласс класса. После дальнейшего исследования я нашел другое решение, и я внедрил его в Swift вот так.

import UIKit

class ContactCell: UITableViewCell {

    @IBOutlet weak var nameLabel: UILabel!

    override func awakeFromNib() {
        super.awakeFromNib()
        // Initialization code
        selectionStyle = .None
    }

    @IBAction func callButtonPressed(sender: UIButton) {
        let indexPath = (self.superview as UITableView).indexPathForCell(self)
        println("indexPath?.row")
    }

}

Но когда я нажимаю на кнопку, она вылетает с сообщением об ошибке: Слишком динамический динамический сбой.

Любая идея, что не так с моим кодом?

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

Спасибо.

4b9b3361

Ответ 1

Похоже, вам нужен делегат:

Делегаты быстро?

Затем просто передайте ячейку как параметр для делегата, а затем вы можете легко сделать tableView.indexPathForCell(cellFromDelegateMethod)

Ответ 2

UIButton.Type действительно не имеет супервизора элемента, но отправитель имеет

var cell: UITableViewCell = sender.superview.superview as UITableViewCell

Ответ 3

Эй вы можете также использовать "тег" кнопки. Внутри метода cellForRowAt делегата таблицы вы можете пометить кнопку с помощью Indexpath.row. вот пример, который я пытался сказать.

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
// get ur cell nib .As it has a button
cell.startOrConntinuBtn.addTarget(self, action: #selector(sumbitOrContinue), for: .touchUpInside) 

cell.startOrConntinuBtn.tag = indexPath.row }

и в методе касания "sumbitOrContinue" -

 func sumbitOrContinue(sender: UIButton!) { 
let tag = sender.tag
// do what you want to do like this example

let detail = self.detailList[tag]
let vc  = self.storyboard?.instantiateViewController(withIdentifier: "mockExamInt") as! MockWindowVc
vc.detailId = detail.id
self.navigationController?.pushViewController(vc, animated: true)}