我如何检查当一个UITextField改变?

我试图检查当文本字段发生变化时,等效于textView - textViewDidChange所使用的函数,到目前为止我已经这样做了:

  func textFieldDidBeginEditing(textField: UITextField) {
if self.status.text == "" && self.username.text == "" {
self.topRightButton.enabled = false
} else {
self.topRightButton.enabled = true
}
}

哪种类型的工作,但topRightButton一经按下文本字段就启用,我希望它仅在实际输入文本时启用?

335619 次浏览

斯威夫特

斯威夫特4.2

textfield.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)), for: .editingChanged)

而且

@objc func textFieldDidChange(_ textField: UITextField) {


}

SWIFT 3 &斯威夫特4.1

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)), for: .editingChanged)

而且

func textFieldDidChange(_ textField: UITextField) {


}

斯威夫特2.2

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

而且

func textFieldDidChange(textField: UITextField) {
//your code
}

objective - c

[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];

和textFieldDidChange方法是

-(void)textFieldDidChange :(UITextField *) textField{
//your code
}

你可以从UITextFieldDelegate中使用这个委托方法。它会随着角色的变化而爆发。

(Objective C) textField:shouldChangeCharactersInRange:replacementString:
(Swift) textField(_:shouldChangeCharactersInRange:replacementString:)

然而,THIS只会触发之前变化(实际上,只有当你从这里返回true时才会发生变化)。

到目前为止我处理它的方式:在UITextFieldDelegate

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool
{
// text hasn't changed yet, you have to compute the text AFTER the edit yourself
let updatedString = (textField.text as NSString?)?.stringByReplacingCharactersInRange(range, withString: string)


// do whatever you need with this updated string (your code)




// always return true so that changes propagate
return true
}

Swift4版本

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)
return true
}

您可以在接口生成器中建立此连接。

    在故事板中,单击屏幕顶部的助理编辑器(中间的两个圆圈)。 李助理编辑选定 < / p > < / >
  1. 在界面构建器中按Ctrl +单击文本字段。

  2. 从EditingChanged拖动到助手视图中的视图控制器类内部。 李正在连接 < / p > < / >

  3. 命名你的函数(例如“textDidChange”)并单击连接。 李命名功能 < / p > < / >

斯威夫特3

 textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(sender:)), for: UIControlEvents.editingChanged)

下面是使用斯威夫特3添加textField text change listener的方法:

将你的类声明为UITextFieldDelegate

override func viewDidLoad() {
super.viewDidLoad()


textField.delegate = self


textField.addTarget(self, action: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:)), for: UIControlEvents.editingChanged)
}

然后只是传统地添加一个textFieldShouldEndEditing函数:

func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { // do stuff
return true
}

文本框(_:shouldChangeCharactersIn: replacementString:)为我工作在Xcode 8, Swift 3如果你想检查每一个按键。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {


// Whatever code you want to run here.
// Keep in mind that the textfield hasn't yet been updated,
// so use 'string' instead of 'textField.text' if you want to
// access the string the textfield will have after a user presses a key


var statusText = self.status.text
var usernameText = self.username.text


switch textField{
case self.status:
statusText = string
case self.username:
usernameText = string
default:
break
}


if statusText == "" && usernameText == "" {
self.topRightButton.enabled = false
} else {
self.topRightButton.enabled = true
}


//Return false if you don't want the textfield to be updated
return true
}

斯威夫特5.0

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
for: .editingChanged)

及处理方法:

@objc func textFieldDidChange(_ textField: UITextField) {


}

斯威夫特4.0

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
for: UIControlEvents.editingChanged)

及处理方法:

@objc func textFieldDidChange(_ textField: UITextField) {


}

斯威夫特3.0

textField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)

及处理方法:

func textFieldDidChange(textField: UITextField) {


}

斯威夫特3.0.1 +(其他一些swift 3.0的答案不是最新的)

textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
for: UIControlEvents.editingChanged)


func textFieldDidChange(_ textField: UITextField) {


}

也许使用RxSwift ?

需要

pod 'RxSwift',    '~> 3.0'
pod 'RxCocoa',    '~> 3.0'

明显地添加导入

import RxSwift
import RxCocoa

所以u有一个textfield : UITextField

let observable: Observable<String?> = textField.rx.text.asObservable()
observable.subscribe(
onNext: {(string: String?) in
print(string!)
})

你有其他3种方法。

  1. onError
  2. oncomplete
  3. onDisposed
  4. onNext

斯威夫特4

在viewDidLoad ():

    //ADD BUTTON TO DISMISS KEYBOARD


// Init a keyboard toolbar
let toolbar = UIView(frame: CGRect(x: 0, y: view.frame.size.height+44, width: view.frame.size.width, height: 44))
toolbar.backgroundColor = UIColor.clear


// Add done button
let doneButt = UIButton(frame: CGRect(x: toolbar.frame.size.width - 60, y: 0, width: 44, height: 44))
doneButt.setTitle("Done", for: .normal)
doneButt.setTitleColor(MAIN_COLOR, for: .normal)
doneButt.titleLabel?.font = UIFont(name: "Titillium-Semibold", size: 13)
doneButt.addTarget(self, action: #selector(dismissKeyboard), for: .touchUpInside)
toolbar.addSubview(doneButt)


USDTextField.inputAccessoryView = toolbar

增加这个函数:

    @objc func dismissKeyboard() {
//Causes the view (or one of its embedded text fields) to resign the first responder status.
view.endEditing(true)
}

斯威夫特4

符合UITextFieldDelegate

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// figure out what the new string will be after the pending edit
let updatedString = (textField.text as NSString?)?.replacingCharacters(in: range, with: string)


// Do whatever you want here




// Return true so that the change happens
return true
}

斯威夫特4

textField.addTarget(self, action: #selector(textIsChanging), for: UIControlEvents.editingChanged)


@objc func textIsChanging(_ textField:UITextField) {


print ("TextField is changing")


}

如果你想在用户完全输入后进行更改(一旦用户退出键盘或按enter键,它将被调用)。

textField.addTarget(self, action: #selector(textDidChange), for: UIControlEvents.editingDidEnd)


@objc func textDidChange(_ textField:UITextField) {


print ("TextField did changed")
}
txf_Subject.addTarget(self, action:#selector(didChangeFirstText), for: .editingChanged)


@objc func didChangeText(textField:UITextField) {
let str = textField.text
if(str?.contains(" "))!{
let newstr = str?.replacingOccurrences(of: " ", with: "")
textField.text = newstr
}
}


@objc func didChangeFirstText(textField:UITextField) {
if(textField.text == " "){
textField.text = ""
}
}

你应该遵循以下步骤:

  1. 对文本框进行Outlet引用
  2. AssignUITextFieldDelegate给控制器类
  3. 配置yourTextField.delegate
  4. 实现你需要的任何函数

示例代码:

import UIKit


class ViewController: UIViewController, UITextFieldDelegate {


@IBOutlet var yourTextFiled : UITextField!


override func viewDidLoad() {
super.viewDidLoad()


yourTextFiled.delegate = self
}




func textFieldDidEndEditing(_ textField: UITextField) {
// your code
}


func textFieldShouldReturn(_ textField: UITextField) -> Bool {
// your code
}


.
.
.
}

斯威夫特4.2

把这个写在viewDidLoad中

// to detect if TextField changed
TextField.addTarget(self, action: #selector(textFieldDidChange(_:)),
for: UIControl.Event.editingChanged)

把这个写在viewDidLoad外面

@objc func textFieldDidChange(_ textField: UITextField) {
// do something
}

你可以通过uicontrol。event。editingdidbegin改变事件或者任何你想检测的东西。

如果你对SwiftUI解决方案感兴趣,这对我来说是有效的:

 TextField("write your answer here...",
text: Binding(
get: {
return self.query
},
set: { (newValue) in
self.fetch(query: newValue) // any action you need
return self.query = newValue
}
)
)

我不得不说这不是我的主意,我是在这个博客上读到的:SwiftUI绑定:一个非常简单的技巧

如果不可能将addTarget绑定到你的UITextField,我建议你像上面建议的那样绑定其中一个,并在shouldChangeCharactersIn方法的末尾插入执行代码。

nameTextField.addTarget(self, action: #selector(RegistrationViewController.textFieldDidChange(_:)), for: .editingChanged)


@objc func textFieldDidChange(_ textField: UITextField) {
if phoneNumberTextField.text!.count == 17 && nameTextField.text!.count > 0 {
continueButtonOutlet.backgroundColor = UIColor(.green)
} else {
continueButtonOutlet.backgroundColor = .systemGray
}
}

在调用中shouldChangeCharactersIn func。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {


guard let text = textField.text else {
return true
}
let lastText = (text as NSString).replacingCharacters(in: range, with: string) as String


if phoneNumberTextField == textField {
textField.text = lastText.format("+7(NNN)-NNN-NN-NN", oldString: text)
textFieldDidChange(phoneNumberTextField)
return false
}
return true
}

现在在iOS13+上有一个UITextField委托方法可用

optional func textFieldDidChangeSelection(_ textField: UITextField)

你可以通过“shouldchangecharter "委托或“开始和结束”;textfield委托。别忘了设置委托

我是用“did begin and end editing”来做到这一点的。在下面。

//MARK:- TextViewDelegate
extension ViewController: UITextFieldDelegate {
func textFieldDidEndEditing(_ textField: UITextField) {
let count = self.tfEmail.text?.count ?? 0
if textField == self.tfEmail {
if count == 0{
//Empty textfield
}else{
//Non-Empty textfield
}
}
}
func textFieldDidBeginEditing(_ textField: UITextField) {
if textField == self.tfEmail{
//when user taps on textfield
}
}
}