当我尝试过如何使用 swift 设置可以输入 UITextField 的最大字符数? https://stackoverflow.com/questions/24641982/how-to-you-set-the-maximum-number-of-characters-that-can-be-entered-into-a-uitex,我看到如果我使用全部10个字符,我也无法删除该字符。
我唯一能做的就是取消操作(将所有字符一起删除)。
有谁知道如何不阻塞键盘(这样我就无法添加其他字母/符号/数字,但我可以使用退格键)?
使用 Swift 5 和 iOS 12,尝试以下实现textField(_:shouldChangeCharactersIn:replacementString:) https://developer.apple.com/documentation/uikit/uitextfielddelegate/1619599-textfield方法是该方法的一部分UITextFieldDelegate
协议:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
- 这段代码最重要的部分是从
range
(NSRange
) to rangeOfTextToReplace
(Range<String.Index>
)。看到这个视频教程 https://talk.objc.io/episodes/S01E80-swift-string-vs-nsstring?t=6了解为什么这种转换很重要。
- 为了使此代码正常工作,您还应该设置
textField
's smartInsertDeleteType https://developer.apple.com/documentation/uikit/uitextinputtraits/2865828-smartinsertdeletetype价值UITextSmartInsertDeleteType.no
。这将防止在执行粘贴操作时可能插入(不需要的)额外空格。
下面的完整示例代码展示了如何实现textField(_:shouldChangeCharactersIn:replacementString:)
in a UIViewController
:
import UIKit
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet var textField: UITextField! // Link this to a UITextField in Storyboard
override func viewDidLoad() {
super.viewDidLoad()
textField.smartInsertDeleteType = UITextSmartInsertDeleteType.no
textField.delegate = self
}
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
guard let textFieldText = textField.text,
let rangeOfTextToReplace = Range(range, in: textFieldText) else {
return false
}
let substringToReplace = textFieldText[rangeOfTextToReplace]
let count = textFieldText.count - substringToReplace.count + string.count
return count <= 10
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)