Верхние символы в UItextfield
У меня вопрос о iOS UIKeyboard
.
У меня есть UITextField
, и я должен иметь keyboard
только с прописными буквами.
Я использую storyboard
, и я попытался установить Cpitalization
как "All characters
" на UITextField properties
.
Но это не решает мою проблему... любое предложение?
Ответы
Ответ 1
Установите тип текстового поля autocapitalizationType
на UITextAutocapitalizationTypeAllCharacters
в UITextField
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;
}
Ответ 2
Для тех, кто ищет версию Swift.
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
просто заставляет клавиатуру открываться с включенной заглавной буквой, но позволяет пользователю отключить ее.
Ответ 3
Одна из проблем, с которыми я столкнулся с некоторыми из вышеперечисленных ответов, - это если вы попытаетесь установить 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
}
Ответ 4
Синтаксис теперь
Swift 2
textField.autocapitalizationType = UITextAutocapitalizationType.AllCharacters
Swift 3
textField.autocapitalizationType = .allCharacters
Ответ 5
Установите UITextField
свойство autocapitalizationType
в UITextAutocapitalizationTypeAllCharacters
. Это приведет к появлению всех символов в верхнем регистре. Также посетите здесь, чтобы узнать больше о текстовых полях
Ответ 6
Это другой подход, который я использовал, когда он делает следующее:
- Обеспечивает капитализацию сразу после ввода символа
- Улавливает ситуации, когда пользователь отключает блокировку кепки, даже если для текстового поля установлено значение auto caps
- Позволяет легко редактировать
- Работает с Swift 2.2
Сначала зарегистрируйте уведомление, которое будет обновляться всякий раз, когда в текстовом поле происходят какие-либо изменения.
textField.addTarget(self, action: #selector(YourClassName.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)
Затем выполните textFieldDidChange
.
func textFieldDidChange(textField: UITextField) {
textField.text = textField.text?.uppercaseString
}
Я выбрал это, чтобы избежать ситуации, когда пользователь видит неравномерный опыт некоторого заглавного слова, но затем изменился после перехода к следующему символу.
Ответ 7
Версия 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
}
}
Ответ 8
Вы также можете использовать этот код.
-(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;
}
Ответ 9
Самый простой способ - реализовать редактируемый измененный метод текстового поля и установить текстовое значение текстового поля в верхнее представление введенного текста.
@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];
}
Ответ 10
Наконец, я нашел способ, который учитывает также редактирование текста в середине строки в 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
}
Ответ 11
Всего один строчный код в ViewDidLoad/ViewDidAppear:
Если вы просто хотите видеть символы, набираемые независимо от верхнего/нижнего регистра для всех символов CAPITALS/UPPER CASE, вставьте приведенный ниже код либо в ViewDidLoad/ViewDidAppear
self.MyTextField.autocapitalizationType =.allCharacters
строка выше заменяет все буквы на прописные, когда вы печатаете автоматически
Ответ 12
Вы должны избегать использования метода делегата
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool
потому что это вызовет нежелательное поведение при вводе с iOS 13 + QuickPath (аналог Swiftkey на клавиатуре iOS).
Если вы проведете пальцем по клавиатуре и напишите "привет", в текстовом поле появится надпись "HELLOHELLOHELLOHELLOHELLO". Это потому, что метод вызывается несколько раз, и он добавляет только что измененный текст через textField.text = uppercasedValue
.
Правильный путь - наблюдать за событием .editingChange
и заглавными буквами, затем значением. Например:
func awakeFromNib() {
textField.addTarget(self, action: #selector(textFieldDidChange), for: .editingChanged)
}
и
@objc func textFieldDidChange() {
textField.text = textField.text?.uppercased()
}
Ответ 13
Может быть, это немного поздно для ответа здесь, но поскольку у меня есть рабочее решение, кому-то это может показаться полезным.
Ну, в следующем методе делегата 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
}
Приведенное выше отлично работает для меня, и аналогичная реализация также работает для текстовых просмотров, сначала сделав правильные настройки.
Надеюсь, что это поможет!
Ответ 14
/**
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
}
Ответ 15
Здесь моя ситуация и как я добился, чтобы заставить верхний текст:
- пользовательский класс (подкласс
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
}
Это установит курсор всегда в правильном положении (где оно было), даже если пользователь добавляет текст в "середину".
Ответ 16
Используя следующий метод делегирования текстового поля, это можно сделать:
- (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;
}
}
}
Надеюсь, что это поможет.