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大写),他们都有问题,光标位置不保留(尝试插入一个字符在现有的文字中)。 这显然发生在UITextField
的text
属性的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
。