Подтвердить что ты не робот

Верхние символы в UItextfield

У меня вопрос о iOS UIKeyboard.

У меня есть UITextField, и я должен иметь keyboard только с прописными буквами.

Я использую storyboard, и я попытался установить Cpitalization как "All characters" на UITextField properties.

Но это не решает мою проблему... любое предложение?

4b9b3361

Ответ 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;
            }
        }


}

Надеюсь, что это поможет.