将目标添加到UITableview内的UITextField(Swift)

时间:2019-03-10 18:38:35

标签: ios swift uitableview uitextfield

我想检查用户何时开始编辑文本字段。关于如何here,有一个很好的明确答案。

但是,在我的情况下,我的textField位于设置为自己的类的UITableview中。我尝试了许多不同的方法来使它起作用,但我一直崩溃:“ libc ++ abi.dylib:以NSException类型的未捕获异常终止”,我在textFieldDidChange func中放了一个中断,但它从未被调用过。问题似乎出在我如何从目标中调用该函数。

class TextFieldCell: UITableViewCell {

    lazy var textField: UITextField = {
        let tf = UITextField()
        tf.translatesAutoresizingMaskIntoConstraints = false
        tf.textAlignment = .center
        tf.textColor = .black
        tf.font = UIFont.systemFont(ofSize: 17)
        tf.clearButtonMode = .whileEditing
        return tf
    }()

    // For simplicity, the rest of the Cell setup not shown.
    // Adds target in AirInput VC to fire method when editing happens

    textField.addTarget(self, action: #selector(AirInputViewController.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)

}


class AirInputViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, UITextFieldDelegate {

    @objc func textFieldDidChange(_ textField: UITextField) {

    }

}

我也为目标尝试了以下操作,它也崩溃了。

textField.addTarget(AirInputViewController.self, action: #selector(AirInputViewController.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)

感觉好像我缺少一些简单的东西,但是我不知道那个简单的解决方法是什么。还是应该在AirInputViewContoller中添加目标?如果是这样,我将如何访问文本字段所在的UITableViewCells?谢谢!

1 个答案:

答案 0 :(得分:1)

您的崩溃很可能是由于您这样做:

textField.addTarget(self, action: #selector(AirInputViewController.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)

这里selfTextFieldCell,所以我认为它会尝试去检查AirInputViewController是否在TextFieldCell内部,不是这种情况。

我会做的:

class TextFieldCell: UITableViewCell {

    weak var delegate: TextFieldCellDelegate?

    lazy var textField: UITextField = {
        // same you have
    }()

    textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: UIControl.Event.editingChanged)

    @objc func textFieldDidChange(_ textField: UITextField) {
        delegate?.textFieldDidChange(textField)
    }

创建一个精美的代表:

protocol TextFieldCellDelegate: class {
     func textFieldDidChange(_ textField: UITextField)
}

class AirInputViewController: TextFieldCellDelegate {

    func textFieldDidChange(_ textField: UITextField) {
        // textField just changed!
    }

    // IMPORTANT! Set the delegate for the cell!

    func tableView(...cellForRow...) {
        let cell = ... as! TextFieldCell
        cell.delegate = self
        ...
        return cell
    }
}

希望有帮助。