UITextField转大写/小写后的光标位置到最后问题

本意是限制输入仅英文字母和数字,同时将字母转为大写。
测试发现了在修改的时候,每输入一个字符,光标都跑到最后,无法连续输入修改。

解决办法:

class CustomField {
// ...
addTarget(self, action: #selector(upperText), for: .editingChanged)
delegate = self
// ...
}

extension CustomField: UITextFieldDelegate {
    
    @objc private func upperText() {
        let textRange: UITextRange? = selectedTextRange
        text = text?.uppercased()
        selectedTextRange = textRange
    }
    
    func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
        
        guard !string.isEmpty else {return true}
        
        let set: CharacterSet = CharacterSet(charactersIn: "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789")
            .inverted
        let result: String = string.components(separatedBy: set)
            .joined(separator: "")
        var valid: Bool = result == string
        let textFieldContent: String = (textField.text ?? "")
            .appending(string)
        if valid, textFieldContent.count > 10 {
            // 字符合法,但是追加后超出长度限制
            valid = false
        }
        return valid
    }
}


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • HTML 5 HTML5概述 因特网上的信息是以网页的形式展示给用户的,因此网页是网络信息传递的载体。网页文件是用...
    阿啊阿吖丁阅读 4,119评论 0 0
  • 1. 关于Vim vim是我最喜欢的编辑器,也是linux下第二强大的编辑器。 虽然emacs是公认的世界第一,我...
    袁小象阅读 358评论 0 0
  • vi编辑器是所有Unix及Linux系统下标准的编辑器,它的强大不逊色于任何最新的文本编辑器,这里只是简单地介绍一...
    KingWorld阅读 290评论 0 1
  • 一、Python简介和环境搭建以及pip的安装 4课时实验课主要内容 【Python简介】: Python 是一个...
    _小老虎_阅读 5,883评论 0 10
  • .bat脚本基本命令语法 目录 批处理的常见命令(未列举的命令还比较多,请查阅帮助信息) 1、REM 和 :: 2...
    庆庆庆庆庆阅读 8,257评论 1 19