无法连接到的UITextField(Cannot connect to UITextField)

2019-10-28 12:58发布

我试图去学习做一个基本的货币转换应用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应该火的时候,我编辑的文本字段,但不这样做现在。 有什么想法吗?

Answer 1:

delegate是一种作用于代,或与另一个对象的协调时该对象遇到在一个程序中的事件的对象。 该委托对象往往是一个responder对象。

的委托对象保持对其他的参考对象的委托和在适当的时候发送一个消息给它。 该消息通知委托对象将要处理或已经处理的只是一个事件的委托。

委托可通过在更新的本身在应用的外观或状态或其他对象响应该消息。

该委托类有一个插座或财产,通常是一个名为委托。 该委托类声明上NSObject的一类方法,并委托实现了只有在它具有与委托对象本身的协调或影响该对象的默认行为感兴趣的那些方法。

我希望现在你知道为什么文本框的委托方法还不能称作。 由于您没有指定您的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
    }
}

学分这个答案。



Answer 2:

设置inputTextField代表。

inputTextField.delegate = self


文章来源: Cannot connect to UITextField