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

Ввод текста текстового поля iPhone в верхний регистр

Как заставить символы вводить текстовое поле на iPhone в верхний регистр?

4b9b3361

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