Очевидно, что вы хотите избежать зацикливания, но вместо этого хотите просто использовать tableauSegues[row]
. Но хитрость в том, как получить row
.
В итоге, вы должны позволить ячейке обрабатывать касание ячейки, и чтобы ячейка сообщала контроллеру табличного представления, когда была нажата его кнопка. Но хитрость заключается в том, что когда он это делает, он должен предоставить ссылку на себя, когда он это делает, чтобы контроллер представления мог определить, к какой строке была нажата его кнопка.
Таким образом, удалите существующий @IBAction
непосредственно между кнопкой и контроллером представления и вместо этого подключите его к @IBAction
в базовом классе ячейки.
// CustomCell.swift
import UIKit
protocol CustomCellDelegate: class {
func didTapButton(_ sender: Any, in cell: CustomCell)
}
class CustomCell: UITableViewCell {
@IBOutlet weak var customLabel: UILabel!
static let preferredReuseIdentifier = "CustomCell"
weak var delegate: CustomCellDelegate?
func configure(text: String, delegate: CustomCellDelegate) {
customLabel.text = text
self.delegate = delegate
}
@IBAction func didTapButton(_ sender: Any) {
delegate?.didTapButton(sender, in: self)
}
}
Обратите внимание, что когда я сконфигурирую эту ячейку, я хочу, чтобы табличное представление предоставляло не только те значения, которые должны отображаться в ячейке, но и указывало, что это делегат для этой ячейки:
// ViewController.swift
import UIKit
class ViewController: UIViewController {
@IBOutlet weak var tableView: UITableView!
var tableauSegues = ["versChapitre1", "versChapitre2", "versChapitre3"]
}
extension ViewController: UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return tableauSegues.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: CustomCell.preferredReuseIdentifier, for: indexPath) as! CustomCell
cell.configure(text: "...", delegate: self)
return cell
}
}
extension ViewController: CustomCellDelegate {
func didTapButton(_ sender: Any, in cell: CustomCell) {
let row = tableView.indexPath(for: cell)!.row
let identifier = tableauSegues[row]
performSegue(withIdentifier: identifier, sender: self)
}
}