J'ai ma classe ViewController qui implémente UITextFieldDelegate. Je n'ai pas de saisie semi-automatique pour les fonctions telles que textFieldShouldBeginEditing. Est-ce un bug dans XCode 6? Voici mon implémentation de classe.
class ViewController: UIViewController, UITextFieldDelegate
Xcode 6 (Beta 1) ne prend actuellement pas en charge la saisie semi-automatique 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 complètement implémenté pour voir ce qui vous manque.
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 rapide est ...
@IBOutlet weak var nameTF: UITextField! { didSet { nameTF.delegate = self } }
Lorsque vous utilisez Swift Version 3.1 avec les prises de UITextFields, marquez les modifications.
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: - ---> Délégués du champ de texte
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;
}
J'ai trouvé un peu de solution. Accédez simplement à l'inspecteur de fichiers et définissez le type sur Objective-C pendant que vous modifiez le fichier. La saisie semi-automatique vous présente Swift options.
Redéfinissez simplement le type sur Swift lorsque vous construisez.
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
}
}
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
}
}
Dans mon cas, par erreur, j'ai ajouté les méthodes déléguées en dehors de la portée de l'implémentation de classe dans Swift et cela restreint les méthodes déléguées à appeler.
J'ai ajouté un point-virgule par erreur à la déclaration de geste, qui était responsable de l'appel de view.endEditing (true) qui à son tour appelle les méthodes déléguées telles que textFieldShouldBeginEditing. Intéressant Swift n'affiche pas de temps de compilation ou d'erreurs d'exécution pour les points-virgules ajoutés parfois, après avoir supprimé le point-virgule, tout fonctionne correctement.