从表格视图单元格中收集文本字段文本(快速)

时间:2018-07-07 12:51:31

标签: ios swift uitableview

我有一个表格视图,每个单元格中都有一个文本字段。我添加了这样的目标:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "customLevelCell") as! LevelTableViewCell

    cell.cellTextField.addTarget(self, action: #selector(ViewController.TextfieldEditAction), for: .editingDidEnd)

    return cell
}

但是发现我无法使用indexpath.row / sender.tag来获取特定的文本字段文本

@objc func TextfieldEditAction(sender: UIButton) {
}

所以我的问题是用户编辑了一个文本字段后如何获取文本。

我还如何获得indexpath.row或sender.tag,它们将用于收集他们添加到该特定文本字段的文本。

2 个答案:

答案 0 :(得分:2)

最简单的方法可能是使用委托协议...

在您的单元格中

protocol LevelTableViewCellDelegate: class {
    func levelTableViewCell(_ levelTableViewCell: LevelTableViewCell, didEndEditingWithText: String?)
}

class LevelTableViewCell: UITableViewCell {
    @IBOutlet private weak var cellTextField: UITextField!
    var delegate: LevelTableViewCellDelegate?

    override func awakeFromNib() {
        cellTextField.addTarget(self, action: #selector(didEndEditing(_:)), for: .editingDidEnd)
    }

    @objc func didEndEditing(_ sender: UITextField) {
        delegate?.levelTableViewCell(self, didEndEditingWithText: sender.text)
    }
}    

在您的视图控制器中

class TableViewController: UITableViewController {

    override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "LevelTableViewCell") as! LevelTableViewCell
        cell.delegate = self
        return cell
    }
}

extension TableViewController: LevelTableViewCellDelegate {

    func levelTableViewCell(_ levelTableViewCell: LevelTableViewCell, didEndEditingWithText: String?) {

        let indexPath = tableView.indexPath(for: levelTableViewCell)

        // Now you have the cell, indexPath AND the string
    }

此外,请注意,视图出口为private。如果遵循此规则,您会发现编写了更简洁的代码

答案 1 :(得分:-2)

以下是UIView的扩展,可用于获取包含textField的单元格或该单元格的indexPath

extension UIView {

    var tableViewCell : UITableViewCell? {

        var subviewClass = self

        while !(subviewClass is UITableViewCell){

            guard let view = subviewClass.superview else { return nil }

            subviewClass = view
        }
        return subviewClass as? UITableViewCell
    }

    func tableViewIndexPath(_ tableView: UITableView) -> IndexPath? {

        if let cell = self.tableViewCell {

            return tableView.indexPath(for: cell)

        }
        return nil
    }
}

示例:-

    @objc func TextfieldEditAction(sender: UITextField) {

        //replace tableView with the name of your tableView
        guard let indexPath = sender.tableViewIndexPath(tableView) else {return}

    }