如何检查UITextField何时更改?
我正在尝试检查一个文本字段的变化,相当于用于textView的function – textViewDidChange
到目前为止,我已经这样做了:
func textFieldDidBeginEditing(textField: UITextField) { if self.status.text == "" && self.username.text == "" { self.topRightButton.enabled = false } else { self.topRightButton.enabled = true } }
哪种types的作品,但topRightButton
文本字段被按下, topRightButton
被启用了,我希望只有当文本被input时才能使用它。
迅速
textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
那么你可以打电话给你的function!
func textFieldDidChange(textField: UITextField) { //your code }
SWIFT 2.2
textField.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)
和
func textFieldDidChange(textField: UITextField) { //your code }
SWIFT 3
textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
和
func textFieldDidChange(_ textField: UITextField) { }
Objective-C的
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
和textFieldDidChange方法是
-(void)textFieldDidChange :(UITextField *) textField{ //your code }
您可以在界面构build器中进行此连接。
-
在故事板中,单击屏幕顶部的助理编辑器(中间的两个圆圈)。
-
Ctrl +点击界面生成器中的文本框。
-
从EditingChanged拖到助理视图中的视图控制器类中。
-
命名您的function(例如“textDidChange”),然后单击连接。
Swift 3.0
textField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
和处理方法:
func textFieldDidChange(textField: UITextField) { }
Swift 4.0
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)), for: UIControlEvents.editingChanged)
和处理方法:
@objc func textFieldDidChange(_ textField: UITextField) { }
Swift 3
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(sender:)), for: UIControlEvents.editingChanged)
我到目前为止处理它的方式:在UITextViewDelegate
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 }
Swift 3.0.1+ (其他一些swift 3.0的答案是不是最新的)
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)), for: UIControlEvents.editingChanged) func textFieldDidChange(_ textField: UITextField) { }
你可以从UITextFieldDelegate中使用这个委托方法。 它随着每个angular色的变化而发生。
(Objective C) textField:shouldChangeCharactersInRange:replacementString: (Swift) textField(_:shouldChangeCharactersInRange:replacementString:)
然而,这只是在改变之前进行的(事实上,只有当你从这里返回时,才会有改变)。
textField(_: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 }
也许使用RxSwift?
需要
pod 'RxSwift', '~> 3.0' pod 'RxCocoa', '~> 3.0'
明显增加import
import RxSwift import RxCocoa
所以你有一个textfield : UITextField
let observable: Observable<String?> = textField.rx.text.asObservable() observable.subscribe( onNext: {(string: String?) in print(string!) })
你还有其他3种方法
- onerror的
- onCompleted
- onDisposed
- onNext
这是你如何使用Swift 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 }