表格视图单元格元素无法单击并获取数据

时间:2019-03-15 05:09:19

标签: ios swift uitableview

我有一个表格视图,在里面放置了一个主视图。在主视图中,我放置了一个按钮,并且在每次使用时单击我的单元格按钮。我需要获取单元格标题标签。这就是我需要的。但是我尝试下面的代码。不知道我错过了什么。它根本没有调用我的cell.add目标行。

单元格中索引处的代码:

cell.cellBtn.tag = indexPath.row
cell.cellBtn.addTarget(self, action:#selector(self.buttonPressed(_:)), for:.touchUpInside)

@objc func buttonPressed(_ sender: AnyObject) {
    print("cell tap")
    let button = sender as? UIButton
    let cell = button?.superview?.superview as? UITableViewCell
    let indexPath = tableView.indexPath(for: cell!)
    let currentCell = tableView.cellForRow(at: indexPath!)! as! KMTrainingTableViewCell
    print(indexPath?.row)
    print(currentCell.cellTitleLabel.text)
}

我什至添加了一个断点,但仍然不是在调用我的cell.addTarget行

也尝试过关闭。在单元格中的索引处:

cell.tapCallback = {
    print(indexPath.row)
}

在我的表格视图单元格中:

var tapCallback: (() -> Void)?
@IBAction func CellBtndidTap(_ sender: Any) {
    print("Right button is tapped")
    tapCallback?() 
}

这里打印语句正在控制台中打印。

2 个答案:

答案 0 :(得分:2)

import UIKit

class ViewController: UIViewController, UITableViewDelegate, UITableViewDataSource {
    var list = [String]()
    @IBOutlet weak var tableView: UITableView!

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return list.count
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! MyTableViewCell
        cell.saveButton.tag = indexPath.row
        //cell.saveButton.accessibilityIdentifier = "some unique identifier"
        cell.tapCallback = { tag in
            print(tag)
        }
        return cell
    }
}

class MyTableViewCell: UITableViewCell {
    // MARK: - IBOutlets
    @IBOutlet weak var saveButton: UIButton!

    // MARK: - IBActions
    @IBAction func saveTapped(_ sender: UIButton) {
        tapCallback?(sender.tag)
    }

    // MARK: - Actions
    var tapCallback: ((Int) -> Void)?
}

答案 1 :(得分:1)

实际上,在视图控制器中添加按钮(包含在表视图单元格中)目标动作不是一个好的编程习惯。我们应该遵循面向协议的方法。请尝试理解该概念。

/*This is my cell Delegate*/
protocol InfoCellDelegate {
    func showItem(item:String)
}


/*This is my cell class*/
class InfoCell: UITableViewCell {
    //make weak reference to avoid the Retain Cycle
    fileprivate weak var delegate: InfoCellDelegate?

    //Outlet for views
    @IBOutlet var showButton: UIButton?

    override func awakeFromNib() {
        super.awakeFromNib()
    }

    override func setSelected(_ selected: Bool, animated: Bool) {
        super.setSelected(selected, animated: animated)
    }

    //This is the public binding function which will bind the data & delegate to cell
    func bind(with: DataModel?, delegate: InfoCellDelegate?, indexPath: IndexPath) {
        //Now the bind the cell with data here
        //.....
        //Assign the delegate
        self.delegate = delegate
    }

    //Button action
    @IBAction func rowSelected(sender: UIButton) {

        self.delegate?.showItem(item: "This is coming from cell")
    }
}


/*Now in your ViewController you need to just confirm the InfoCellDelegate & call the bind function*/
class ListViewController: UIViewController {
     //Views initialisation & other initial process
}

//Table view Delegate & Data source
extension ListViewController: UITableViewDataSource, UITableViewDelegate {
    /**
    Configure the table views
    */
    func configureTable() {

        //for item table
        self.listTable.register(UINib.init(nibName: "\(InfoCell.classForCoder())", bundle: nil), forCellReuseIdentifier: "\(InfoCell.classForCoder())")
    }

    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 5
    }

    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {

        let cell = tableView.dequeueReusableCell(withIdentifier: "InfoCell") as! InfoCell

        cell.bind(with: DataModel, delegate: self, indexPath: indexPath)

        return cell
    }
}

extension ListViewController: InfoCellDelegate {
    func showItem(item) {
        print(item)
    }
}