Как заставить символы вводить текстовое поле на iPhone в верхний регистр?
Ввод текста текстового поля iPhone в верхний регистр
Ответ 1
Установите autocapitalizationType
на UITextAutocapitalizationTypeAllCharacters
на UITextField
.
Подробнее см. протокол UITextInputTraits (принятый UITextField).
Ответ 2
Это решение не полностью удовлетворяет.
Даже если параметр 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;
}
Ответ 3
В то время как все остальные ответы действительно работают (они делают ввод в верхнем регистре), все они имеют проблему, что позиция курсора не сохраняется (попробуйте вставить символ в середине существующего текста). Это, по-видимому, происходит в установщике свойства UITextField
text
, и я не нашел способ его программного восстановления (например, восстановление исходного selectedTextRange
не работает).
Однако хорошая новость заключается в том, что существует прямой способ заменить части текста UITextField
(или 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
.
Ответ 4
Вместо того, чтобы проверить, является ли символ верхним или нижним регистром, просто предположите, что это строчный регистр. Гораздо проще.
В
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
метод:
NSString *newString = [[textField.text stringByAppendingString:string] uppercaseString];
textField.text = newString;
return NO;
Ответ 5
Это мой код, когда у меня есть 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;
}
Ответ 6
Простейшим способом было бы реализовать модифицированный метод редактирования текстового поля и установить текстовое значение текстового поля в верхнее представление введенного текста
- (IBAction)TextFieldEditingChanged:(id)sender
{
_yourTextField.text = [_yourTextField.text uppercaseString];
}
Ответ 7
return 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;
}
Ответ 8
Возможно, я не нашел все перегибы этому методу, но пока это хорошо работает для меня. Кажется, что избежать проблем с выбором прыжка до конца, если вы спуститесь по маршруту возврата НЕТ из -textField: shouldChangeCharactersInRange: replacementString:. Поскольку UITextField соответствует UIKeyInput, просто переопределите метод -insertText:, чтобы изменить входную строку в верхний регистр, прежде чем вызывать супер с прописной строкой:
- (void)insertText:(NSString *)text {
NSString *uppercaseText = [text uppercaseString]
[super insertText:uppercaseText]
}
Или, если вы перешли к Swift:
override func insertText(text: String) {
let uppercaseText = text.uppercaseString
super.insertText(uppercaseText)
}
Ответ 9
Меня вдохновили предыдущие ответы (спасибо), но у всех из них были некоторые недостатки:
- Использование textField.autocapitalizationType не помогает, когда вы также нуждаетесь в строчном или даже большем контроле.
- textField.text = "my String" устанавливает курсор в конец текстового поля, который действительно раздражает при редактировании.
Итак, это мой код Swift, который дает вам полный контроль над типизированными символами (прописными, строчными, игнорируемыми...) И позволяет курсору, где вы его ожидаете. Код проверен для работы с несколькими текстовыми полями.
Изменить: проверено с помощью 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
}
Ответ 10
Для автоматического ввода верхнего регистра в текстовое поле:
Случай 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() в вашем контроллере вида. Хотя в этом случае пользователь может отключить кнопку caps на клавиатуре.
urTextFieldName.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;
Ответ 11
Одна из проблем, с которыми я столкнулся с некоторыми из вышеперечисленных ответов, - это если вы попытаетесь установить 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
}
Вам все равно придется обращаться, если пользователь нажимает клавишу Return, Готово и т.д. на клавиатуре. Просто добавьте:
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
.