J'essaie de vérifier quand un champ de texte change, équivalent aussi à la fonction utilisée pour textView - textViewDidChange
jusqu'à présent, j'ai fait ceci:
func textFieldDidBeginEditing(textField: UITextField) {
if self.status.text == "" && self.username.text == "" {
self.topRightButton.enabled = false
} else {
self.topRightButton.enabled = true
}
}
Quel type de travail fonctionne, mais la topRightButton
est activée dès que le champ de texte est activé, je souhaite l’activer uniquement lorsque le texte est réellement saisi?
Rapide
textField.addTarget(self, action: "textFieldDidChange:", forControlEvents: UIControlEvents.EditingChanged)
Ensuite, vous pouvez simplement appeler votre fonction!
func textFieldDidChange(textField: UITextField) {
//your code
}
Swift 2.2
textField.addTarget(self, action: #selector(YourViewController.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)
et
func textFieldDidChange(textField: UITextField) {
//your code
}
Swift 3 & Swift 4.1
textField.addTarget(self, action: #selector(textFieldDidChange(_:)), for: .editingChanged)
et
func textFieldDidChange(_ textField: UITextField) {
}
Swift 4
@objc func textFieldDidChange(_ textField: UITextField) {
}
OBJECTIF C
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
et la méthode textFieldDidChange est
-(void)textFieldDidChange :(UITextField *) textField{
//your code
}
Vous pouvez établir cette connexion dans le générateur d'interface.
Dans votre storyboard, cliquez sur l’assistant éditeur en haut de l’écran (deux cercles au milieu) .
Ctrl + clic sur le champ de texte dans le générateur d'interface.
Faites glisser de EditingChanged à l'intérieur de votre classe de contrôleur de vue dans la vue de l'assistant .
Nommez votre fonction ("textDidChange" par exemple) et cliquez sur connect .
textField.addTarget(self, action: #selector(textFieldDidChange(textField:)), for: .editingChanged)
et méthode de la poignée:
func textFieldDidChange(textField: UITextField) {
}
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
for: UIControlEvents.editingChanged)
et méthode de la poignée:
@objc func textFieldDidChange(_ textField: UITextField) {
}
La façon dont je l'ai traité jusqu'à présent: dans 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
}
Version 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
}
Swift 3
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(sender:)), for: UIControlEvents.editingChanged)
Swift 3.0.1+ (Certaines des autres réponses à Swift 3.0 ne sont pas à jour)
textField.addTarget(self, action: #selector(ViewController.textFieldDidChange(_:)),
for: UIControlEvents.editingChanged)
func textFieldDidChange(_ textField: UITextField) {
}
textField (_: shouldChangeCharactersIn: replacementString :) a travaillé pour moi dans Xcode 8, Swift 3 si vous souhaitez vérifier chaque pression de touche.
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
}
Swift 4
Conforme à 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
}
Vous pouvez utiliser cette méthode de délégué à partir de UITextFieldDelegate. Il se déclenche à chaque changement de personnage.
(Objective C) textField:shouldChangeCharactersInRange:replacementString:
(Swift) textField(_:shouldChangeCharactersInRange:replacementString:)
Cependant, CE SEULEMENT FIREAVANTun changement est effectué (en fait, un changement est effectué uniquement si vous retournez la valeur true à partir d'ici).
Swift 4
textField.addTarget(self, action: #selector(textIsChanging), for: UIControlEvents.editingChanged)
@objc func textIsChanging(_ textField:UITextField) {
print ("TextField is changing")
}
Si vous voulez apporter une modification une fois que l'utilisateur a complètement saisi (il sera appelé une fois que l'utilisateur aura quitté le clavier ou appuyé sur entrée).
textField.addTarget(self, action: #selector(textDidChange), for: UIControlEvents.editingDidEnd)
@objc func textDidChange(_ textField:UITextField) {
print ("TextField did changed")
}
Peut-être utiliser RxSwift?
avoir besoin
pod 'RxSwift', '~> 3.0'
pod 'RxCocoa', '~> 3.0'
ajouter des importations évidemment
import RxSwift
import RxCocoa
Donc tu as un textfield : UITextField
let observable: Observable<String?> = textField.rx.text.asObservable()
observable.subscribe(
onNext: {(string: String?) in
print(string!)
})
U a 3 autres méthodes ..
Vous devriez suivre ces étapes:
Exemple de code:
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
}
.
.
.
}
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 = ""
}
}
créer une nouvelle classe personnalisée MaterialTextfield.Swift
class MaterialTextfield: UITextField,UITextFieldDelegate {
var bottomBorder = UIView()
var shouldShowEditing = false
override func awakeFromNib() {
// Setup Bottom-Border
self.delegate = self
self.translatesAutoresizingMaskIntoConstraints = false
bottomBorder = UIView.init(frame: CGRect(x: 0, y: 0, width: 0, height: 0))
bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1) // Set Border-Color
bottomBorder.translatesAutoresizingMaskIntoConstraints = false
addSubview(bottomBorder)
bottomBorder.bottomAnchor.constraint(equalTo: bottomAnchor).isActive = true
bottomBorder.leftAnchor.constraint(equalTo: leftAnchor).isActive = true
bottomBorder.rightAnchor.constraint(equalTo: rightAnchor).isActive = true
bottomBorder.heightAnchor.constraint(equalToConstant: 1).isActive = true // Set Border-Strength
}
@IBInspectable var hasError: Bool = false {
didSet {
if (hasError) {
bottomBorder.backgroundColor = UIColor.red//error color
} else {
bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1)//passive color
}
}
}
@IBInspectable var showEditing: Bool = false{
didSet {
if (showEditing) {
bottomBorder.backgroundColor = UIColor(rgb: 0x56B5CA)//active color
} else {
bottomBorder.backgroundColor = UIColor(rgb: 0xE2DCD1)//passive color
}
}
}
func textFieldDidBeginEditing(_ textField: UITextField) {//listen to on edit event
showEditing = !self.showEditing
}
func textFieldDidEndEditing(_ textField: UITextField) {//listen to on end edit event
showEditing = !self.showEditing
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {//listen to return button event
textField.resignFirstResponder() // return button will close keyboard
return true
}
}
Voici comment ajouter un textField text change listener
en utilisant Swift 3 :
Déclarez votre classe comme UITextFieldDelegate
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
textField.addTarget(self, action: #selector(UITextFieldDelegate.textFieldShouldEndEditing(_:)), for: UIControlEvents.editingChanged)
}
Ensuite, ajoutez simplement une fonction textFieldShouldEndEditing:
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool { // do stuff
return true
}