无法连接到UITextField

时间:2017-07-10 03:06:49

标签: ios swift 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下的函数应该触发,但现在没有这样做。有什么想法吗?

2 个答案:

答案 0 :(得分:4)

设置inputTextField委托。

inputTextField.delegate = self

答案 1 :(得分:2)

delegate是一个对象,当该对象遇到程序中的事件时,该对象代表另一个对象或与另一个对象协同工作。委托对象通常是responder对象。

委托对象保留对另一个对象(委托)的引用,并在适当的时候向其发送消息。该消息通知委托委托对象即将处理或刚刚处理的事件。

委托可以通过更新应用程序中自身或其他对象的外观或状态来响应消息。

委托类有一个出口或属性,通常是一个名为delegate的出口或属性。 委托类声明NSObject类别的方法,委托只实现那些有兴趣与委托对象协调或影响该对象的默认行为的方法。

我希望你能得到为什么没有调用textfield委托方法。由于您尚未将ViewController指定为inputTextField的代表。因此,inputTextField刚刚处理的消息未发送到您的ViewController

您可以查看this链接以了解有关委托的详情。要了解委托模式的工作原理,请检查this链接。

您可以将您的类设置为textfield的委托

inputTextField.delegate = self;

----- ---- EDIT

如何检测文本字段中当前文本的内容?

在viewDidLoad中添加

inputTextField.addTarget(self, action: #selector(typingInput), for: .editingChanged)

将方法定义为

func typingInput(textField:UITextField){
    if let typedText = textField.text {        
        print(typedText ) // get the current string
    }
}

this ans。

的信用