我已经使用了3个文本字段,并希望它们只保留一个整数用于OTP目的(这是项目设计的需要)。当用户在第一个文本字段中输入数字时,响应者应自动分配到第二个文本字段,然后分配到第三个文本字段。一旦用户在第三个文本字段中输入最后一个OTP数字,我就想点击web服务。到目前为止我所做的是:
class ActivationCodeVC: UIViewController, UITextFieldDelegate
然后
otpField1.delegate = self
otpField2.delegate = self
otpField3.delegate = self
然后
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let text=textField.text
let counter = text?.characters.count
if counter >= 1 {
if textField == otpField1{
otpField2.becomeFirstResponder()
} else if textField == otpField2{
otpField3.becomeFirstResponder()
} else if textField == otpField3{
otpField3.resignFirstResponder()
}
}
return true
}
当用户在第一个文本字段中输入数字时,光标应在第二个文本字段上开始闪烁。但它并没有。按下第二个数字后,它将其输入到第二个文本字段,然后光标再次移动到第三个数字,但仍保留在第二个文本字段中。其次,当我尝试通过退格键删除数字时,比方说,当我尝试删除第一个文本字段数字时,它会从第二个文本字段中删除数字。
请帮助我实施哪些方法以及如何正确实现这些功能。
我试过了,但是字符在第二个文本字段而不是第一个字段中打印,依此类推。
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let text = textField.text
// create Range<Index> object from old-style one
let start = text!.startIndex.advancedBy(range.location)
let end = start.advancedBy(range.length)
let indexRange = start..<end
// calculate result string value
let result = text!.stringByReplacingCharactersInRange(indexRange, withString: string)
// let text=textField.text
let tempCount = result.characters.count
if tempCount == 1 {
if textField == otpField1{
otpField2.becomeFirstResponder()
} else if textField == otpField2{
otpField3.becomeFirstResponder()
} else if textField == otpField3{
otpField3.resignFirstResponder()
let tempCode = otpField1.text! + otpField2.text! + otpField3.text!
if !APPDELEGATE.internetStatusFalse {
KVNProgress.showWithStatus("Loading...")
let soapApiObj: SoapApi = SoapApi()
mode = ControllerTypeMode.ACTIVAITONCODE
soapApiObj.resDelegate = self
soapApiObj.responseString = NSMutableString(string: "")
soapApiObj.callActivationCodeApi(tempCode)
}
else{
let obj: SuccessFullPopVC=self.storyboard?.instantiateViewControllerWithIdentifier("successFullPopVC") as! SuccessFullPopVC
obj.titlelbl = LocalizationSystem.sharedLocalSystem().localizedStringForKey("Warning", value: nil)
obj.imgSuccess = UIImage(named: "warning")
obj.messagelbl = LocalizationSystem.sharedLocalSystem().localizedStringForKey("No internet connection.", value: nil)
self.navigationController?.presentViewController(obj, animated: false, completion: nil)
}
}
}
return true
}
感谢最终解决方案:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
let text = textField.text
// create Range<Index> object from old-style one
let start = text!.startIndex.advancedBy(range.location)
let end = start.advancedBy(range.length)
let indexRange = start..<end
// calculate result string value
let result = text!.stringByReplacingCharactersInRange(indexRange, withString: string)
let newLength = result.characters.count
if textField == otpField1{
if newLength == 1 {
otpField1.text = result
otpField2.becomeFirstResponder()
return false
}
} else if textField == otpField2{
if newLength == 1 {
otpField2.text = result
otpField3.becomeFirstResponder()
return false
}
} else if textField == otpField3{
if newLength == 1 {
otpField3.text = result
return false
}
}
return !(result.characters.count>1)
}
有效!!
答案 0 :(得分:1)
{/ 1}} - 委托方法在实际文本更改之前调用(在您的情况下为字符放置/删除)。
首先,计算您在输入操作后获得的字符串。在下面的代码段中使用委托方法参数(Public Sub savetoDB()
Dim mydate As DateTime
mydate = Me.dtpDateDel.Value
con.Open()
Dim sqlQry As String = "INSERT INTO [tbl_Monitoring] ([Truck Plate No], [Driver], [Helper], [Date of Delivery], [Product], [Payment], [Customer]) VALUES (@p1, @p2, @p3, @p4, @p5, @p6, @p7)"
Using cmd As New OleDbCommand(sqlQry, con)
cmd.Parameters.AddWithValue("@p1", cbxTruck.Text)
cmd.Parameters.AddWithValue("@p2", cbxDriver.Text)
cmd.Parameters.AddWithValue("@p3", cbxHelper.Text)
cmd.Parameters.AddWithValue("@p4", mydate)
// Alternatively you need to use something like this to format it correctly.
//cmd.Parameters.AddWithValue("@p4", mydate.ToString("dd/mm/yyyy hh:mm"))
cmd.Parameters.AddWithValue("@p5", cbxProduct.Text)
cmd.Parameters.AddWithValue("@p6", txtPayment.Text)
cmd.Parameters.AddWithValue("@p7", txtCustomer.Text)
cmd.ExecuteNonQuery()
con.Close()
MsgBox("Save Successfully!")
End Using
End Sub
,shouldChangeCharactersInRange
)和range
。
string
答案 1 :(得分:0)
Updated for Swift 3:
Used below simple code:
//To asssing next responder
func textFieldShouldReturn(_ textField: UITextField) -> Bool {
if (textField == self.nameTextField) {
self.textField = self.emailTextField
self.emailTextField.becomeFirstResponder()
} else if (textField == self.emailTextField) {
self.textField = self.phoneNumberTextfield
self.phoneNumberTextfield.becomeFirstResponder()
} else if(textField == self.phoneNumberTextfield) {
self.textField = self.amountTextField
self.amountTextField.becomeFirstResponder()
} else if (textField == self.amountTextField) {
self.textField = self.descriptionTextField
self.descriptionTextField.becomeFirstResponder()
} else {
textField.resignFirstResponder()
}
return false
}