web-dev-qa-db-ja.com

大文字へのiPhone Force Textbox入力

IPhoneのテキストボックスに入力した文字を大文字にする方法を教えてください。

37
hungbm06

autocapitalizationTypeUITextAutocapitalizationTypeAllCharactersUITextFieldに設定します。

詳細は ITextInputTraitsプロトコル(UITextFieldで採用) を参照してください。

50
Adam Woś

他のすべての回答は実際には機能しますが(入力は大文字になります)、カーソルの位置が保持されないという問題があります(既存のテキストの中央に文字を挿入してみてください)。これは明らかにUITextFieldtextプロパティのセッターで発生し、プログラムで復元する方法が見つかりませんでした(たとえば、元のselectedTextRangeを復元しても機能しません)。

ただし、朗報は、この問題の影響を受けないUITextField(またはUITextView 's)のテキストの一部を直接置き換える方法があることです。

- (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 のドキュメントを参照してください。

32
Daniel Rinser

最も簡単な方法は、テキストフィールドの変更された編集メソッドを実装し、テキストフィールドのテキスト値を入力されたテキストの大文字表現に設定することです。

- (IBAction)TextFieldEditingChanged:(id)sender
{
    _yourTextField.text = [_yourTextField.text uppercaseString];
}
2
Omkar Guhilot

文字が大文字であるか小文字であるかをテストするのではなく、小文字であると想定してください。はるかに簡単です。

の中に

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string

方法:

NSString *newString = [[textField.text stringByAppendingString:string] uppercaseString];
textField.text = newString;

return NO;
2
jay492355

たぶん、私はこの方法のすべての欠点を発見していませんが、これまでのところ、それは私にとってはうまくいきます。 [〜#〜] no [〜#〜] from -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)
}
1

nOを返すと、戻るボタンに問題が発生します。

これを使う

- (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;

}
1

私は以前の答え(ありがとう)に刺激を受けましたが、それらすべてにいくつかの欠陥がありました:

  • textField.autocapitalizationTypeを使用しても、小文字またはさらに細かい制御が必要な場合は役に立ちません。
  • textField.text = "my String"は、カーソルをtextFieldの最後に設定します。これは、編集時に本当に煩わしいものです。

つまり、これはmy 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
}
1
Gerd Castan

テキストフィールドに大文字を自動的に入力するには:

ケース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;
0
user2929279