Activer un bouton dans Swift seulement si tous les champs de texte n'ont pas été remplis
J'ai de la difficulté à trouver comment modifier mon code pour faire en sorte que le bouton dans la barre de navigation est activé lors de mes trois champs de texte sont bien remplies.
J'ai actuellement trois UITextFields et un UIButtonItem. À la fois le habitNameField et la goalField manuel sont des champs de texte, et le frequencyField est un Sélecteur de Vue.
@IBOutlet weak var habitNameField: UITextField!
@IBOutlet weak var goalField: UITextField!
@IBOutlet weak var frequencyField: UITextField!
@IBOutlet weak var doneBarButton: UIBarButtonItem!
J'ai aussi la fonction suivante qui fonctionne quand il y a quelque chose tapé dans le premier champ.
func textField(habitNameField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let oldHabitNameText: NSString = habitNameField.text!
let newHabitNameText: NSString = oldHabitNameText.stringByReplacingCharactersInRange(range, withString: string)
doneBarButton.enabled = (newHabitNameText.length != 0)
return true
}
J'ai essayé de changer le code de sorte qu'il a pris dans les deux autres domaines que les paramètres et les permis de doneBarButton seulement si tous les trois champs ont été remplis.
func textField(habitNameField: UITextField, goalField: UITextField, frequencyField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let habitNameText: NSString = (habitNameField.text!).stringByReplacingCharactersInRange(range, withString: string)
let goalText: NSString = (goalField.text!).stringByReplacingCharactersInRange(range, withString: string)
let frequencyText: NSString = (frequencyField.text!).stringByReplacingCharactersInRange(range, withString: string)
doneBarButton.enabled = (habitNameText.length != 0) && (goalText.length != 0) && (frequencyText.length != 0)
return true
}
Toutefois, cela ne fonctionne pas, même quand je remplir les trois champs de texte.
Je serais vraiment reconnaissant de toute aide, et merci à toute personne qui contribue à l'avance!
Tout le code ici:
class HabitDetailViewController: UITableViewController, UITextFieldDelegate, UIPickerViewDataSource,UIPickerViewDelegate {
@IBOutlet weak var habitNameField: UITextField!
@IBOutlet weak var goalField: UITextField!
@IBOutlet weak var doneBarButton: UIBarButtonItem!
@IBOutlet weak var frequencyField: UITextField!
var frequencies = ["Day", "Week", "Month", "Year"]
var frequencyPicker = UIPickerView()
var habitToEdit: HabitItem?
weak var delegate: HabitDetailViewControllerDelegate?
@IBAction func cancel() {
delegate?.habitDetailViewControllerDidCancel(self)
}
@IBAction func done() {
print("You plan to do \(habitNameField.text!) \(goalField.text!) times a \(frequencyField.text!.lowercaseString).")
if let habit = habitToEdit {
habit.name = habitNameField.text!
habit.numberLeft = Int(goalField.text!)!
habit.frequency = frequencyField.text!
delegate?.habitDetailViewController(self, didFinishEditingHabit: habit)
} else {
let habit = HabitItem()
habit.name = habitNameField.text!
habit.numberLeft = Int(goalField.text!)!
habit.frequency = frequencyField.text!
habit.completed = false
delegate?.habitDetailViewController(self, didFinishAddingHabit: habit)
}
}
override func viewWillAppear(animated: Bool) {
super.viewWillAppear(animated)
habitNameField.becomeFirstResponder()
frequencyPicker.hidden = false
}
override func viewDidLoad() {
super.viewDidLoad()
frequencyPicker.dataSource = self
frequencyPicker.delegate = self
doneBarButton.enabled = false
habitNameField.addTarget(self, action: "checkFields:", forControlEvents: .EditingChanged)
goalField.addTarget(self, action: "checkFields:", forControlEvents: .EditingChanged)
frequencyField.addTarget(self, action: "checkFields:", forControlEvents: .EditingChanged)
frequencyField.inputView = frequencyPicker
if let habit = habitToEdit {
title = "Edit Item"
habitNameField.text = habit.name
goalField.text = String(habit.numberLeft)
doneBarButton.enabled = true
}
}
override func tableView(tableView: UITableView, willSelectRowAtIndexPath indexPath: NSIndexPath) -> NSIndexPath? {
return nil
}
func textField(habitNameField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let oldHabitNameText: NSString = habitNameField.text!
let newHabitNameText: NSString = oldHabitNameText.stringByReplacingCharactersInRange(range, withString: string)
doneBarButton.enabled = (newHabitNameText.length != 0)
return true
}
func checkFields(sender: UITextField) {
sender.text = sender.text?.stringByTrimmingCharactersInSet(.whitespaceCharacterSet())
guard
let habit = habitNameField.text where !habit.isEmpty,
let goal = goalField.text where !goal.isEmpty,
let frequency = frequencyField.text where !frequency.isEmpty
else { return }
//enable your button if all conditions are met
doneBarButton.enabled = true
}
OriginalL'auteur Derek Mei | 2016-01-22
Vous devez vous connecter pour publier un commentaire.
Xcode 9 • Swift 4
Vous pouvez
addTarget
à vos champs de texte à surveiller pour l'événement de contrôle.editingChanged
et l'utilisation d'un sélecteur unique méthode pour tous:Créer le sélecteur de la méthode et de l'utilisation
guard
combiné avecwhere
de l'alinéa (Swift 3/4 utilise une virgule) pour s'assurer que tous les champs de texte ne sont pas vide sinon juste retour. Swift 3 ne nécessite pas @objc, mais Swift 4:exemple
Durr. C'est une erreur de débutant de ma part. Merci de m'aider à attraper. Aussi, le dernier champ de texte pour la fréquence ne fonctionne pas parce que c'est un sélecteur de vue. Toutes les idées sur qui?
Vous pouvez créer un booléen var pour le surveiller et le drapeau une fois les ensembles d'utilisateurs. Ensuite, il suffit de l'ajouter à la garde-déclaration
Qui fonctionne! Je vous remercie beaucoup pour votre aide 🙂
comment vérifier l'adresse e-mail et ne vide pas pour unique objet textfield, essayé ceci, mais ne fonctionne pas laisser emaiTextField = existingEmailAddressTextField.texte, !emaiTextField.isEmpty, laissez validEmail = existingEmailAddressTextField.texte, de soi.validateEmail(validEmail)==true,
OriginalL'auteur Leo Dabus
Swift 3 /Xcode 8.2
et puis créer la sélecteur de méthode et l'utilisation garde:
P. S. swift 3 "où" ==>>> ","
Excellente solution! Vous devez marquer le "textFieldsIsNotEmpty' "@objc' d'autre le compilateur génère une erreur. Veuillez mettre à jour la réponse.
Hey, @Prabhav. Prêt, merci
comment vérifier l'id e-mail valide ou pas et vide pour le même champ de texte
OriginalL'auteur A.Kant
La meilleure façon serait d'Ajouter de l'observateur dans la méthode ViewDidLoad. Que viens de vérifier dans le textField Délégué méthode si tous les objets textfield sont remplis ou non. Une fois rempli appel oberserver méthode & que vous avez juste besoin d'activer le bouton.
Remarque:
Espère que ça va vous aider.
OriginalL'auteur Mayur
}
OriginalL'auteur Ramy Kfoury
pourquoi ne pas déplacer la vérification de la fonctionnalité d'une fonction distincte
et ensuite utiliser
OriginalL'auteur Russell
Cela fonctionne pour moi: j'Espère que ça aide
OriginalL'auteur Alakh
Je suis allé de l'avant et abstrait, c'est peu à peu dans une classe d'assistance que l'on peut utiliser pour leur projet swift.
Et puis dans votre Vue-Contrôleur simplement init l'aide avec
Assurez-vous de garder une référence forte au dessus pour éviter que la désallocation
OriginalL'auteur Stus
Vous pouvez créer un tableau de champs de texte
[UITextField]
ou de la prise de collecte. Appelons le tableautextFields
ou quelque chose comme ça.Et appeler le code ci-dessus dans une méthode qui surveille le texte du champ de texte.
OriginalL'auteur xcocoader