Ios 在swift中聚焦文本字段
我在一个注册屏幕上有4个文本字段,我设置了它,这样当用户在每个文本字段上按next时,下一个文本字段就会被聚焦。代码如下:Ios 在swift中聚焦文本字段,ios,swift,textfield,Ios,Swift,Textfield,我在一个注册屏幕上有4个文本字段,我设置了它,这样当用户在每个文本字段上按next时,下一个文本字段就会被聚焦。代码如下: func textFieldShouldReturn(textField: UITextField) -> Bool { if (textField == self.fNameField) { textField.resignFirstResponder() self.sNameField.becomeF
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
}
在返回最终文本字段时,我调用了一个checkforerrors函数(如下)。其中,如果任何字段出现问题,我希望将焦点放在该文本字段上,以便用户可以轻松更正它。发生的情况是,出现错误的文本字段正在聚焦(按照checkForErrors函数的指示)一秒钟,但随后焦点将切换回密码文本字段。我还尝试将self.passwordField.resignFirstResponder()
添加到上述函数的最后一个else中,这会使密码字段失去焦点,但是遇到问题的文本字段根本没有获得焦点(甚至一秒钟都没有),我如何解决这个问题
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
}
这对我很有用:
import UIKit
class ViewController:UIViewController, UITextFieldDelegate {
@IBOutlet weak var fNameField: UITextField!
@IBOutlet weak var sNameField: UITextField!
@IBOutlet weak var emailField: UITextField!
@IBOutlet weak var passwordField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
fNameField.delegate = self
sNameField.delegate = self
emailField.delegate = self
passwordField.delegate = self
}
func isValidEmail (test:String) ->Bool{
// your email validation here...
return true
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
if (textField == self.fNameField) {
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
}
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, toFocus:self.fNameField)
}
else if sNameField.text.isEmpty
{
errors = true
message += "Surname empty"
alertWithTitle(title, message: message, ViewController: self, toFocus:self.sNameField)
self.sNameField.becomeFirstResponder()
}
else if emailField.text.isEmpty
{
errors = true
message += "Email empty"
alertWithTitle(title, message: message, ViewController: self, toFocus:self.emailField)
}
else if !isValidEmail(emailField.text)
{
errors = true
message += "Invalid Email Address"
alertWithTitle(title, message: message, ViewController: self, toFocus:self.emailField)
}
else if passwordField.text.isEmpty
{
errors = true
message += "Password empty"
alertWithTitle(title, message: message, ViewController: self, toFocus:passwordField)
}
else if count(passwordField.text.utf16)<8
{
errors = true
message += "Password must be at least 8 characters"
alertWithTitle(title, message: message, ViewController: self, toFocus:self.passwordField)
}
return errors
}
func alertWithTitle(title: String!, message: String, ViewController: UIViewController, toFocus:UITextField) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
let action = UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel,handler: {_ in
toFocus.becomeFirstResponder()
});
alert.addAction(action)
ViewController.presentViewController(alert, animated: true, completion:nil)
}
}
导入UIKit
类ViewController:UIViewController、UIExtFieldDelegate{
@IBOutlet弱变量fNameField:UITextField!
@IBOutlet弱var sNameField:UITextField!
@IBOutlet弱var emailField:UITextField!
@IBOUTLE弱var密码字段:UITextField!
重写func viewDidLoad(){
super.viewDidLoad()
fNameField.delegate=self
sNameField.delegate=self
emailField.delegate=self
passwordField.delegate=self
}
func isValidEmail(测试:字符串)->Bool{
//您的电子邮件验证在此。。。
返回真值
}
func textField应返回(textField:UITextField)->Bool{
textField.resignFirstResponder()辞职
if(textField==self.fNameField){
self.sNameField.becomeFirstResponder()
}
else if(textField==self.sNameField){
self.emailField.becomeFirstResponder()
}else if(textField==self.emailField){
self.passwordField.becomeFirstResponder()
}
否则{
var therewererrors=checkForErrors()
如果!有错误
{
//有条件地切换到下一屏幕
}
}
返回真值
}
func checkForErrors()->Bool
{
var错误=错误
让title=“错误”
var message=“”
如果fNameField.text.isEmpty{
错误=真
消息+=“名字为空”
alertWithTitle(标题、消息:消息、ViewController:self、toFocus:self.fNameField)
}
否则,如果sNameField.text.isEmpty
{
错误=真
消息+=“姓氏为空”
alertWithTitle(标题、消息:消息、视图控制器:self、toFocus:self.sNameField)
self.sNameField.becomeFirstResponder()
}
如果emailField.text.i为空,则为else
{
错误=真
消息+=“电子邮件为空”
alertWithTitle(标题、消息:消息、ViewController:self、toFocus:self.emailField)
}
else if!isValidEmail(emailField.text)
{
错误=真
消息+=“无效的电子邮件地址”
alertWithTitle(标题、消息:消息、ViewController:self、toFocus:self.emailField)
}
如果passwordField.text.i为空,则为else
{
错误=真
消息+=“密码为空”
alertWithTitle(标题、消息:消息、ViewController:self、toFocus:passwordField)
}
否则如果计数(passwordField.text.utf16)所需的文本字段。成为第一响应者()
你在textFieldDidBeginEditing中写了什么?发布那个code@iAnurag我没有这个控制器上的textfield DidBeginediting你是如何管理你的textfield代理的?@iAnurag我还没有时间添加这个功能。我对swift非常陌生。我应该在那里做些什么导致abov出现问题e?什么是alertWithTitle()
做的?正如其他人所说,有更干净的方法来处理所有这些问题,这是代码中的根本问题。我在这里做的是稍微理清一些事情,确保带有错误的文本字段只有在警报解除后才得到关注。
import UIKit
class ViewController:UIViewController, UITextFieldDelegate {
@IBOutlet weak var fNameField: UITextField!
@IBOutlet weak var sNameField: UITextField!
@IBOutlet weak var emailField: UITextField!
@IBOutlet weak var passwordField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
fNameField.delegate = self
sNameField.delegate = self
emailField.delegate = self
passwordField.delegate = self
}
func isValidEmail (test:String) ->Bool{
// your email validation here...
return true
}
func textFieldShouldReturn(textField: UITextField) -> Bool {
textField.resignFirstResponder()
if (textField == self.fNameField) {
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
}
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, toFocus:self.fNameField)
}
else if sNameField.text.isEmpty
{
errors = true
message += "Surname empty"
alertWithTitle(title, message: message, ViewController: self, toFocus:self.sNameField)
self.sNameField.becomeFirstResponder()
}
else if emailField.text.isEmpty
{
errors = true
message += "Email empty"
alertWithTitle(title, message: message, ViewController: self, toFocus:self.emailField)
}
else if !isValidEmail(emailField.text)
{
errors = true
message += "Invalid Email Address"
alertWithTitle(title, message: message, ViewController: self, toFocus:self.emailField)
}
else if passwordField.text.isEmpty
{
errors = true
message += "Password empty"
alertWithTitle(title, message: message, ViewController: self, toFocus:passwordField)
}
else if count(passwordField.text.utf16)<8
{
errors = true
message += "Password must be at least 8 characters"
alertWithTitle(title, message: message, ViewController: self, toFocus:self.passwordField)
}
return errors
}
func alertWithTitle(title: String!, message: String, ViewController: UIViewController, toFocus:UITextField) {
let alert = UIAlertController(title: title, message: message, preferredStyle: .Alert)
let action = UIAlertAction(title: "OK", style: UIAlertActionStyle.Cancel,handler: {_ in
toFocus.becomeFirstResponder()
});
alert.addAction(action)
ViewController.presentViewController(alert, animated: true, completion:nil)
}
}