在文本字段中分配和辞职第一响应者

Posted

技术标签:

【中文标题】在文本字段中分配和辞职第一响应者【英文标题】:Assigning and Resigning first responder in text field 【发布时间】:2017-04-28 08:22:47 【问题描述】:

我正在实现一个 OTP 功能,如 Auto Resign and assign first responder in text field in Swift 所示,但在以下几行中出现错误,因为它们已被 Swift 3 弃用

    let start = text!.startIndex.advancedBy(range.location)
    let end = start.advancedBy(range.length)

解决方法是什么?

【问题讨论】:

添加有问题的错误。 使用 [textField resignFirstResponder] 和 [textField becomeFirstResponder] 是方法,但你在使用这些方法时遇到什么错误? 'advancedBy' 不可用:要将索引推进 n 步,请在生成索引的 CharacterView 实例上调用 'index(_:offsetBy:)'。 【参考方案1】:

如果你想实现 otp 功能。以下是您可以使用的代码。 每个文本字段都有标签,根据标签值,您可以轻松响应下一个文本字段。

extension YOUR_VC:UITextFieldDelegate

func textFieldDidBeginEditing(_ textField: UITextField) 
 // to make text field empty    
 textField.text = ""



func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool 

    if(string.length == 1)
        textField.text = string
        textField.resignFirstResponder();

    
    return false


func textFieldDidEndEditing(_ textField: UITextField) 
    // for making next text field first responder after a character is entered in previous textfield
    switch textField.tag 
    case 1:
        otpTextTwo.becomeFirstResponder()
    case 2:
        otpTextThree.becomeFirstResponder()
    case 3:
        otpTextFour.becomeFirstResponder()
    case 4:
        otpTextFive.becomeFirstResponder()
    case 5:
        otpTextSix.becomeFirstResponder()
    case 6:

       // self.doneFecthingOtp()
    default:
        //print("NOt case")
    
 

希望这会有所帮助。

【讨论】:

【参考方案2】:

你应该在swift3中这样写:

let start = text?.index((text?.startIndex)!, offsetBy: range.location)
let end = text?.index(start!, offsetBy: range.length)
let indexRange = text?[start! ..< end!]

【讨论】:

以上是关于在文本字段中分配和辞职第一响应者的主要内容,如果未能解决你的问题,请参考以下文章

辞职第一响应者 UITextfield

使用 UIToolbar/UITextField 辞职第一响应者问题

触摸 contentview 后辞职第一响应者

iOS:响应者辞职时,文本从子类 UITextfield 中消失

从单独的班级辞职第一响应者

UITextField 辞职第一响应者 iOS4