我有一个关于iOS UIKeyboard
的问题。
我有一个UITextField
,我希望keyboard
只有大写字符。
我使用storyboard
,我试图将Cpitalization
设置为“All characters
”到UITextField properties
。
但这不能解决我的问题......有什么建议吗?
在UITextField上将文本字段类型autocapitalizationType
设置为UITextAutocapitalizationTypeAllCharacters
self.yourTexField.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
致电委托后
//委托方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSRange lowercaseCharRange = [string rangeOfCharacterFromSet:[NSCharacterSet lowercaseLetterCharacterSet]];
if (lowercaseCharRange.location != NSNotFound) {
textField.text = [textField.text stringByReplacingCharactersInRange:range
withString:[string uppercaseString]];
return NO;
}
return YES;
}
最后,我找到了尊重UITextField
中字符串中间编辑文本的方式。
问题是,如果用UITextFiled.text
属性替换整个文本,实际光标将移动到文本结尾。因此,您需要使用.replace()
方法准确指定要更新到upperCase的字符。
最后一件事是将string.isEmpty
作为函数的返回值返回 - 否则你不允许删除文本。
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
if let text = textField.text, let textRange = Range(range, in: text) {
let uppercasedString = string.uppercased()
let updatedText = text.replacingCharacters(in: textRange, with: uppercasedString)
if let selectedTextRange = textField.selectedTextRange {
textField.replace(selectedTextRange, withText: uppercasedString)
approveButtonState(vin: updatedText)
}
return string.isEmpty
}
return false
}
如果你只想在ViewDidLoad / ViewDidAppear下面的代码下面的所有CAPITALS / UPPER CASE粘贴中看到输入的字符,无论UPPER /小写如何
self.MyTextField.autocapitalizationType = .allCharacters
当您自动键入时,上面的行会将所有字母更改为CAPITALS
也许这里的答案有点晚了,但是由于我有一个有效的解决方案,有人可能觉得它很有用。
好吧,在下面的textfield委托方法中,检查新字符串是否包含任何小写字符。如果是这样,那么:
false
。否则只返回true
并让方法按预期工作。
这是它的实现:
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
var returnValue = true
let lowercaseRange = string.rangeOfCharacter(from: CharacterSet.lowercaseLetters)
if let _ = lowercaseRange?.isEmpty {
returnValue = false
}
if !returnValue {
textField.text = (textField.text! + string).uppercased()
}
return returnValue
}
以上对我来说非常有效,当然,在进行适当的调整之后,类似的实现也适用于textviews。
希望能帮助到你!
/**
We take full control of the text entered so that lowercase cannot be inserted
we replace lowercase to uppercase
*/
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
// No spaces allowed
if string == " " {
return false
}
// delete key pressed
if string == "" {
textField.deleteBackward()
return false
}
// We only allow alphabet and numbers
let numbersAndLettersSet = CharacterSet.alphanumerics
if string.lowercased().rangeOfCharacter(from: numbersAndLettersSet) == nil {
return false
}
// Add the entered text
textField.insertText(string.uppercased())
// Return false as we are doing full control
return false
}
这里有我的情况以及我如何强制强制上面的文字:
UITextField
子类)UITextFieldDelegate
方法@CodeBender提出的解决方案几乎就是我所寻找的,但是从@Dan注意到,光标总是跳到最后。
class MyCustomTextField: UITextField {
...
addTarget(self, action: #selector(upperText), for: .editingChanged)
...
...
@objc private func upperText() {
let textRange = selectedTextRange
text = text?.uppercased()
selectedTextRange = textRange
}
即使用户在“中间”添加文本,这也会将光标始终设置在正确的位置(它的位置)。
使用以下文本字段委托方法可以完成:
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string {
//--- Making uppercase ---//
if (textField == yourTextField ) {
NSRange lowercaseCharRange;
lowercaseCharRange = [string rangeOfCharacterFromSet:[NSCharacterSet lowercaseLetterCharacterSet]];
if (lowercaseCharRange.location != NSNotFound) {
textField.text = [textField.text stringByReplacingCharactersInRange:range
withString:[string uppercaseString]];
return NO;
}
}
}
希望这可以帮助。
对于那些寻找Swift版本的人。
斯威夫特4
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
textField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.uppercased())
return false
}
原始答案
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
textField.text = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string.uppercaseString)
return false
}
使用Capitalization: All Characters
属性只是强制键盘打开,大写锁定,但让用户关闭它。
我对上述一些答案的一个问题是,如果你尝试设置textfield.text
,你将失去光标位置。因此,如果用户尝试编辑文本的中间部分,光标将跳转到结尾。
这是我的Swift解决方案,仍然使用UITextFieldDelegate
:
func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
if textField == textFieldToUppercase {
if string == "" {
// User presses backspace
textField.deleteBackward()
} else {
// User presses a key or pastes
textField.insertText(string.uppercaseString)
}
// Do not let specified text range to be changed
return false
}
return true
}
语法现在
斯威夫特2
textField.autocapitalizationType = UITextAutocapitalizationType.AllCharacters
斯威夫特3
textField.autocapitalizationType = .allCharacters
将UITextField
属性autocapitalizationType
设为UITextAutocapitalizationTypeAllCharacters
。这将使所有字符以大写字母显示。另请访问here以查找有关文本字段的更多信息
这是我使用的不同方法,它执行以下操作:
首先,只要在文本字段中发生任何更改,就会注册要更新的通知。
textField.addTarget(self, action: #selector(YourClassName.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)
然后,实施textFieldDidChange
。
func textFieldDidChange(textField: UITextField) {
textField.text = textField.text?.uppercaseString
}
我之所以选择此选项是为了避免用户看到某些大写字母的不均匀体验,但一旦移动到下一个字符就会改变。
Swift 4.0版本:
首先将要大写的文本字段的委托设置为当前的ViewController(单击从文本字段拖动到currentViewController以设置委托)。
添加扩展名后:
extension CurrentViewController: UITextFieldDelegate{
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
//refference to the textfield you want to target
if textField.tag == 5{
textField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.uppercased())
return false
}
return true
}
}
您也可以使用此代码。
-(BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{
// Uppercase for string which you need
textField.text = [textField.text stringByReplacingCharactersInRange:range
withString:[string uppercaseString]];
// return NO because You have already done it in above code
return NO;
}
最简单的方法是实现文本字段的编辑更改方法,并将文本字段的文本值设置为输入文本的大写表示。
@property (nonatomic, strong) IBOutlet UITextField *yourTextfield
// add target in code or use interface builder
[self.yourTextField addTarget:self
action:@selector(uppercaseTextField)
forControlEvents:UIControlEventEditingChanged];
- (IBAction)uppercaseTextField:(UITextField*)textField
{
textField.text = [textField.text uppercaseString];
}