我想检查用户何时开始编辑文本字段。关于如何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?谢谢!
答案 0 :(得分:1)
您的崩溃很可能是由于您这样做:
textField.addTarget(self, action: #selector(AirInputViewController.textFieldDidChange(_:)), for: UIControl.Event.editingChanged)
这里self
是TextFieldCell
,所以我认为它会尝试去检查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
}
}
希望有帮助。