Mettre en œuvre UITextFieldDelegate avec Swift
j'ai ma classe ViewController qui implémente UITextFieldDelegate. Je n'ai pas d'auto complète pour les fonctions telles que textFieldShouldBeginEditing. Est-ce un bug dans XCode 6? Voici mon implémentation de la classe.
class ViewController: UIViewController, UITextFieldDelegate
11 réponses
Xcode 6 (Beta 1) ne supporte pas actuellement autocomplete pour les méthodes/propriétés de protocole non implémentées (pour Swift).
Votre meilleur pari est de <CMD> - click
sur le protocole qui n'est pas encore entièrement mis en œuvre pour voir ce que vous manquez.
class ViewController: UIViewController,UITextFieldDelegate //set delegate to class
@IBOutlet var txtValue: UITextField //create a textfile variable
override func viewDidLoad() {
super.viewDidLoad()
txtValue.delegate = self //set delegate to textfile
}
func textFieldDidBeginEditing(textField: UITextField!) { //delegate method
}
func textFieldShouldEndEditing(textField: UITextField!) -> Bool { //delegate method
return false
}
func textFieldShouldReturn(textField: UITextField!) -> Bool { //delegate method
textField.resignFirstResponder()
return true
}
Swift 3.0.1
// UITextField Delegates
func textFieldDidBeginEditing(_ textField: UITextField) {
}
func textFieldDidEndEditing(_ textField: UITextField) {
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
return true;
}
func textFieldShouldClear(_ textField: UITextField) -> Bool {
return true;
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
return true;
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return true;
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder();
return true;
}
Un peu plus swifty est ...
@IBOutlet weak var nameTF: UITextField! { didSet { nameTF.delegate = self } }
lors de L'utilisation de la version 3.1 de Swift avec les sorties D'UITextFields, marquez les changements.
import UIKit
class LoginViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var txtUserID: UITextField!
@IBOutlet var txtPwd: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
txtUserID.delegate = self
txtPwd.delegate = self
}
// UITextField Delegates
func textFieldDidBeginEditing(_ textField: UITextField) {
print("TextField did begin editing method called")
}
func textFieldDidEndEditing(_ textField: UITextField) {
print("TextField did end editing method called\(textField.text!)")
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
print("TextField should begin editing method called")
return true;
}
func textFieldShouldClear(_ textField: UITextField) -> Bool {
print("TextField should clear method called")
return true;
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
print("TextField should end editing method called")
return true;
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
print("While entering the characters this method gets called")
return true;
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
print("TextField should return method called")
textField.resignFirstResponder();
return true;
}
}
// MARQUE:- ---> Textfield Délégués
func textFieldDidBeginEditing(textField: UITextField) {
print("TextField did begin editing method called")
}
func textFieldDidEndEditing(textField: UITextField) {
print("TextField did end editing method called\(textField.text)")
}
func textFieldShouldBeginEditing(textField: UITextField) -> Bool {
print("TextField should begin editing method called")
return true;
}
func textFieldShouldClear(textField: UITextField) -> Bool {
print("TextField should clear method called")
return true;
}
func textFieldShouldEndEditing(textField: UITextField) -> Bool {
print("TextField should end editing method called")
return true;
}
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
print("While entering the characters this method gets called")
return true;
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
print("TextField should return method called")
textField.resignFirstResponder();
return true;
}
Swift 3
@IBOutlet weak var yourNameTextfield: UITextField! {
didSet {
yourNameTextfield.delegate = self
}
}
extension YourNameViewController: UITextFieldDelegate {
func textFieldDidBeginEditing(_ textField: UITextField) {
}
func textFieldDidEndEditing(_ textField: UITextField) {
}
func textFieldShouldBeginEditing(_ textField: UITextField) -> Bool {
return true
}
func textFieldShouldClear(_ textField: UITextField) -> Bool {
return true
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
return true
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
return true
}
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
textField.resignFirstResponder();
return true
}
}
j'ai trouvé un peu de travail. Il suffit d'aller à l'inspecteur de fichier et de mettre le type à L'Objectif-C pendant que vous éditez le fichier. L'achèvement automatique vous présente les options Swift.
commutez simplement le type de nouveau à Swift lorsque vous construisez.
dans mon cas par erreur j'ai ajouté les méthodes delegate en dehors de la portée de l'implémentation de classe dans swift et cela restreint les méthodes delegate à appeler.
j'ai eu un point-virgule par erreur ajouter à la déclaration de geste, qui était responsable de l'appel de vue.endEditing (true) qui, à son tour, appelle les méthodes delegate telles que textFieldShouldBeginEditing. Swift intéressant ne montre pas de temps de compilation ou d'erreurs de temps d'exécution pour les points-virgule ajoutés parfois, après avoir supprimé le point-virgule Tout fonctionne très bien.
Swift 4:
@IBOutlet weak var yourNameTextField: UITextField! {
didSet {
yourNameTextField.delegate = self
}
}
extension YourNameViewController: UITextFieldDelegate {
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
switch textField {
case yourNameTextField:
yourNameTextField.resignFirstResponder()
default:
break
}
return true
}
func textFieldShouldEndEditing(_ textField: UITextField) -> Bool {
return true
}
}