Ich habe 4 Textfelder auf einem Register Bildschirm und ich habe es eingerichtet, so dass, wenn der Benutzer als nächstes auf jedem Textfeld drückt, das nächste Textfeld ist fokussiert. Code unten:Fokussieren eines Textfelds in swift
func textFieldShouldReturn(textField: UITextField) -> Bool {
if (textField == self.fNameField) {
textField.resignFirstResponder()
self.sNameField.becomeFirstResponder()
}
else if (textField == self.sNameField) {
self.emailField.becomeFirstResponder()
} else if (textField == self.emailField) {
self.passwordField.becomeFirstResponder()
}
else{
var thereWereErrors = checkForErrors()
if !thereWereErrors
{
//conditionally segue to next screen
}
}
return true
}
Nach der Rückkehr des endgültigen Textfelds, rufe ich eine Überprüfung auf Fehler (unten). Wenn ein Problem mit irgendeinem Feld besteht, möchte ich dieses Textfeld so fokussieren, dass der Benutzer es leicht korrigieren kann. Was passiert, ist, dass das Textfeld mit dem Fehler für eine Sekunde fokussiert wird (wie von den checkForErrors-Funktionen angewiesen), aber dann wird wieder auf das Passwort-Textfeld umgeschaltet. Ich habe auch versucht, self.passwordField.resignFirstResponder()
in die letzte andere der oben genannten Funktion hinzuzufügen, und das Passwortfeld verliert den Fokus, aber dann das Textfeld mit dem aufgetretenen Problem ist überhaupt nicht Fokus (nicht einmal für eine Sekunde wie zuvor) Wie kann ich beheben Dies?
func checkForErrors() -> Bool
{
var errors = false
let title = "Error"
var message = ""
if fNameField.text.isEmpty {
errors = true
message += "First name empty"
alertWithTitle(title, message: message, ViewController: self)
self.fNameField.becomeFirstResponder()
}
else if sNameField.text.isEmpty
{
errors = true
message += "Surname empty"
alertWithTitle(title, message: message, ViewController: self)
self.sNameField.becomeFirstResponder()
}
else if emailField.text.isEmpty
{
errors = true
message += "Email empty"
alertWithTitle(title, message: message, ViewController: self)
self.emailField.becomeFirstResponder()
}
else if !isValidEmail(emailField.text)
{
errors = true
message += "Invalid Email Address"
alertWithTitle(title, message: message, ViewController: self)
self.emailField.becomeFirstResponder()
}
else if passwordField.text.isEmpty
{
errors = true
message += "Password empty"
alertWithTitle(title, message: message, ViewController: self)
self.passwordField.becomeFirstResponder()
}
else if count(passwordField.text.utf16)<8
{
errors = true
message += "Password must be at least 8 characters"
alertWithTitle(title, message: message, ViewController: self)
self.passwordField.becomeFirstResponder()
}
return errors
}
Hinweis Ich habe den TextField Delegate enthalten.
Warnung Titel Funktion wie gewünscht:
func alertWithTitle(title: String!, #message: String, #ViewController: UIViewController) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
let action = UIAlertAction(title: "OK", style: .Cancel, handler: nil)
alert.addAction(action)
ViewController.presentViewController(alert, animated: true, completion: nil)
}
was haben Sie schreiben in textFieldDidBeginEditing? poste diesen Code – iAnurag
@iAnurag Ich habe keine textFieldDidBeginEditing auf diesem Controller – user2363025
Wie verwalten Sie Ihre Textfield Delegaten? – iAnurag