iPhone强制文本框input大写

我如何强制input到iPhone上的文本框的字符大写?

UITextField autocapitalizationType UITextAutocapitalizationTypeAllCharacters设置为UITextAutocapitalizationTypeAllCharacters

有关更多详细信息,请参阅UITextInputTraits协议(由UITextField采用) 。

这个解决scheme不完全令人满意。

即使将autocapitalizationType设置为UITextAutocapitalizationTypeAllCharacters ,用户仍然可以按UITextAutocapitalizationTypeAllCharacters来释放大写locking。 而textField.text = [textField.text stringByReplacingCharactersInRange:range withString:[string uppercaseString]]; return NO; textField.text = [textField.text stringByReplacingCharactersInRange:range withString:[string uppercaseString]]; return NO; 解决scheme并不是那么好:如果用户编辑了文本的中间部分(在textField.text = ,编辑光标移到了string的末尾),我们将放弃编辑点。

我已经做了两个解决scheme的混合,这是我的build议:设置UITextAutocapitalizationTypeAllCharacters ,并将下面的代码添加到UITextField的委托。

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { // Check if the added string contains lowercase characters. // If so, those characters are replaced by uppercase characters. // But this has the effect of losing the editing point // (only when trying to edit with lowercase characters), // because the text of the UITextField is modified. // That is why we only replace the text when this is really needed. NSRange lowercaseCharRange; lowercaseCharRange = [string rangeOfCharacterFromSet:[NSCharacterSet lowercaseLetterCharacterSet]]; if (lowercaseCharRange.location != NSNotFound) { textField.text = [textField.text stringByReplacingCharactersInRange:range withString:[string uppercaseString]]; return NO; } return YES; } 

虽然所有其他的答案确实工作(他们使input大写),他们都有问题,光标位置不保留(尝试插入一个字符在现有的文字中)。 这显然发生在UITextFieldtext属性的setter,我还没有find一种方法来以编程方式恢复它(例如,恢复原始selectedTextRange不起作用)。

不过,好消息是,有一种直接的方法可以replaceUITextField (或UITextView )文本的一部分,而不会遇到这个问题:

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { // not so easy to get an UITextRange from an NSRange... // thanks to Nicolas Bachschmidt (see http://stackoverflow.com/questions/9126709/create-uitextrange-from-nsrange) UITextPosition *beginning = textField.beginningOfDocument; UITextPosition *start = [textField positionFromPosition:beginning offset:range.location]; UITextPosition *end = [textField positionFromPosition:start offset:range.length]; UITextRange *textRange = [textField textRangeFromPosition:start toPosition:end]; // replace the text in the range with the upper case version of the replacement string [textField replaceRange:textRange withText:[string uppercaseString]]; // don't change the characters automatically return NO; } 

有关这些方法的更多信息,请参阅UITextInput的文档。

而不是testing字符是大写还是小写,只是假设它是小写字母。 简单得多。

在里面

 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string 

方法:

 NSString *newString = [[textField.text stringByAppendingString:string] uppercaseString]; textField.text = newString; return NO; 

最简单的方法是实现文本字段的编辑改变方法,并将文本字段的文本值设置为input文本的大写字母表示

 - (IBAction)TextFieldEditingChanged:(id)sender { _yourTextField.text = [_yourTextField.text uppercaseString]; } 

这是我的代码,当我有6个textFields

希望你能明白这一点

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { if (textField==self.textField6) { self.textField6.text = [textField.text stringByReplacingCharactersInRange:range withString:[string uppercaseString]]; return NO; } return YES; } 

返回NO会有后退button的问题;

用这个

 - (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{ if ([[string uppercaseString] isEqualToString:string]) { return YES; } NSString *newString = [[textField.text stringByAppendingString:string] uppercaseString]; textField.text = newString; return NO; } 

也许我还没有find这个方法的所有问题,但到目前为止它对我来说效果不错。 它似乎避免了跳转select到最后的问题,如果你沿着从_textField返回NO的路线:shouldChangeCharactersInRange:replacementString:。 由于UITextField符合UIKeyInput,只需重写方法-insertText:在用大写string调用super之前将inputstring更改为大写:

 - (void)insertText:(NSString *)text { NSString *uppercaseText = [text uppercaseString] [super insertText:uppercaseText] } 

或者如果你已经搬到了Swift:

 override func insertText(text: String) { let uppercaseText = text.uppercaseString super.insertText(uppercaseText) } 

我以前的答案(谢谢)的启发,但他们都有一些缺陷给我:

  • 使用textField.autocapitalizationType时,你也想小写甚至更多的控制没有帮助。
  • textField.text =“我的string”将光标设置为textField的编辑结束时真的很烦人。

所以这是我的Swift代码,它可以让你完全控制input的字符(大写,小写,忽略…),并让光标在你期望的位置。 代码已经过testing,可以使用多个textField。

编辑:testing与iOS 8.3

  func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool { // modify string as and if the user wants: // at this place you can also return false to ignore the replacement completely. var str = string if !Defaults.isUpperOrLower() { if Defaults.isAllLetterUpper() { str = string.uppercaseString } else { str = string.lowercaseString } } // updating textField.text sets the curser position to the end // so we store the cursor position before updating. let selRange = textField.selectedTextRange // Update textField as requested and modified. var txt = textField.text as NSString textField.text = txt.stringByReplacingCharactersInRange(range, withString: str) // recalculate and set the cursor position in the textField: // tested with // 1. typing a character // 2. backspace // 3. selecting a range + backspace // 4. selecting a range + typing a character if let selRange = selRange { var newPosition: UITextPosition? if range.length == 0 { // normal character newPosition = textField.positionFromPosition(selRange.end, inDirection: UITextLayoutDirection.Right, offset: count(string)) } else { // backspace newPosition = textField.positionFromPosition(selRange.end, inDirection: UITextLayoutDirection.Left, offset: range.length - count(string)) } textField.selectedTextRange = textField.textRangeFromPosition(newPosition, toPosition: newPosition) } // return false because we did everything manually return false } 

在文本框中自动input大写字母:

案例1:添加UITextDelegate协议并实现以下方法

 -(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string { textField.text = [textField.text stringByReplacingCharactersInRange:range withString:[string capitalizedString]]; return NO; } 

情况2:在视图控制器的ViewDidLoad()方法中设置以下参数。 虽然在这种情况下用户可以closures键盘上的button。

 urTextFieldName.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters; 

我遇到的一个问题是如果你尝试设置textfield.text ,你会失去光标位置。 所以如果用户试图编辑文本的中间, 光标会跳到最后

这里是我简单的Swift解决scheme,仍然使用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 } 

如果用户按下键盘上的返回键, 完成键等,您仍然需要处理。 只需添加:

 if string == "\n" { // Do something when 'Done' is pressed, like dismiss the keyboard textField.resignFirstResponder() return false } 

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