无法连接到UITextField
我正在做一个基本的货币转换应用程序,试图学习ios
开发,但不知道如何聆听UITextField
事件。 这是我的代码到目前为止:
// // ViewController.swift // Currency // import UIKit class ViewController: UIViewController , UIPickerViewDelegate , UIPickerViewDataSource , UITextViewDelegate , UITextFieldDelegate { @IBOutlet var pickerView : UIPickerView! @IBOutlet var inputTextField : UITextField! @IBOutlet weak var outputText: UILabel! // definface pickerdata : note it's a constant let pickerData = ["euro", "us-dollar", "yen", "yuan", "peso"] // initialize src and tgt currency with listeners // note not sure what to do with these observers yet var src : String = "" // { did set {} } var tgt : String = "" override func viewDidLoad() { super.viewDidLoad() // instance of this class is source of data pickerView.dataSource = self pickerView.delegate = self // match default srce and tgt to ios default src = pickerData[0] tgt = pickerData[0] // disable spell check inputTextField.autocorrectionType = UITextAutocorrectionType.no } //MARK: - UIPickerView data source method func numberOfComponents(in pickerView: UIPickerView) -> Int { // number of components in pickerData return 2 } // UIPickerViewDelegate methods func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int { // number of rows return pickerData.count } //MARK: Delegates - places data into picker func pickerView(_ pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String? { return pickerData[row] } // responding to row selections and also need to write to UILabel // NOTE: we need to func pickerView(_ pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { if component == 0 { src = pickerData[row] } else { tgt = pickerData[row] } let rate = Data.getExchangeRate(inputUnit: src, outputUnit: tgt) print (">> (src,tgt): (", src, ",", tgt, ") value: ", inputTextField.text) outputText.text = "hello world" } //MARK: - UITextFieldDelegate methods func textFieldShouldBeginEditing(_ textField : UITextField) -> Bool{ print("TextField did begin editing method called") return true } func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool{ print("textField changing") return true } }
当我编辑文本字段时, //MARK: - UITextFieldDelegate methods
的函数应该会触发,但是现在还没有这样做。 有什么想法吗?
delegate
是一个对象,当该对象在程序中遇到事件时,代表另一个对象或与之协调。 委托对象通常是responder
对象。
委托对象保持对另一个对象(委托)的引用,并在适当的时候向其发送消息。 该消息通知代理事件委托对象即将处理或刚刚处理。
委托人可以通过更新应用程序中的自身或其他对象的外观或状态来对消息做出响应。
委托类有一个出口或属性,通常是一个名为委托。 委托类在NSObject类别上声明方法,委托只实现那些有兴趣与委托对象进行协调或影响该对象默认行为的方法。
我希望现在你明白为什么textfield委托方法没有被调用。 因为您还没有将ViewController
作为inputTextField
委托来分配。 因此inputTextField
刚刚处理的消息不会传递到您的ViewController
。
您可以查看此链接以了解有关委托的更多信息。 要知道委托模式如何工作,请检查此链接。
您可以将您的课程设置为文本字段的代表
inputTextField.delegate = self;
– – -编辑 – –
如何检测文本字段中的当前文本?
在viewDidLoad中添加
inputTextField.addTarget(self, action: #selector(typingInput), for: .editingChanged)
定义方法为
func typingInput(textField:UITextField){ if let typedText = textField.text { print(typedText ) // get the current string } }
学分到这个答案。
设置inputTextField
委托。
inputTextField.delegate = self