如何强制在iPhone上的文本框中输入字符为大写?
答案 0 :(得分:49)
在autocapitalizationType
上将UITextAutocapitalizationTypeAllCharacters
设为UITextField
。
有关详细信息,请参阅UITextInputTraits protocol (adopted by UITextField)。
答案 1 :(得分:36)
此解决方案并不完全令人满意。
即使将autocapitalizationType
设置为UITextAutocapitalizationTypeAllCharacters
,用户仍然可以按下大写以释放大写锁定。而textField.text = [textField.text stringByReplacingCharactersInRange:range withString:[string uppercaseString]]; return NO;
解决方案并不是那么好:如果用户编辑文本的中间部分,我们会松开编辑点(在textField.text =
之后,编辑光标会到达字符串的末尾)。
我已经完成了两个解决方案的混合,这就是我的建议:设置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;
}
答案 2 :(得分:31)
虽然所有其他答案确实有效(它们使输入大写),但它们都存在不保留光标位置的问题(尝试在现有文本的中间插入一个字符)。这显然发生在UITextField
的{{1}}属性的setter中,我还没有找到以编程方式恢复它的方法(例如,恢复原始text
不起作用)。< / p>
然而,好消息是,有一种直接方法可以替换selectedTextRange
(或UITextField
)文本的部分内容,而这些文本不会受到此问题的影响:
UITextView
有关这些方法的详细信息,请参阅UITextInput
的文档。
答案 3 :(得分:2)
不是测试角色是大写还是小写,而是假设它是小写的。更简单。
在
中-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
方法:
NSString *newString = [[textField.text stringByAppendingString:string] uppercaseString];
textField.text = newString;
return NO;
答案 4 :(得分:2)
这是我的代码,当我有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;
}
答案 5 :(得分:2)
最简单的方法是,实现文本字段的编辑更改方法,并将文本字段的文本值设置为输入文本的大写字母
- (IBAction)TextFieldEditingChanged:(id)sender
{
_yourTextField.text = [_yourTextField.text uppercaseString];
}
答案 6 :(得分:1)
返回NO会出现后退按钮问题;
beter使用此
- (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;
}
答案 7 :(得分:1)
也许我还没有发现这种方法的所有问题,但到目前为止它对我来说效果很好。如果你从 -textField:shouldChangeCharactersInRange:replacementString:返回 NO 的路线,似乎可以避免将选择跳到最后的问题。由于UITextField符合UIKeyInput,因此只需覆盖方法 -insertText:,在使用大写字符串调用super之前将输入字符串更改为大写:
- (void)insertText:(NSString *)text {
NSString *uppercaseText = [text uppercaseString]
[super insertText:uppercaseText]
}
或者,如果您已经转移到Swift:
override func insertText(text: String) {
let uppercaseText = text.uppercaseString
super.insertText(uppercaseText)
}
答案 8 :(得分:1)
我的灵感来自之前的答案(谢谢),但所有这些都有一些瑕疵:
所以这是我的Swift代码,它可以让你完全控制输入的字符(大写,小写,忽略......)并将光标放在你期望的位置。测试代码以使用多个textField。
编辑:使用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
}
答案 9 :(得分:0)
在文本字段中自动输入大写:
案例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()方法中设置以下参数。虽然在这种情况下用户可以关闭键盘上的大写按钮。
urTextFieldName.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
答案 10 :(得分:0)
我对上述一些答案的一个问题是,如果您尝试设置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
}
如果用户按下键盘上的返回,完成等键,您仍然需要处理。只需添加:
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
内部。