我正在制作一个基本货币转换应用,以尝试学习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
下的函数应该触发,但现在没有这样做。有什么想法吗?
答案 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。
的信用