39

iPhone のテキスト ボックスに入力する文字を強制的に大文字にするにはどうすればよいですか?

4

11 に答える 11

52

に設定autocapitalizationTypeUITextAutocapitalizationTypeAllCharactersますUITextField

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

于 2010-01-08T11:30:58.713 に答える
36

この解決策は、完全に満足できるものではありません。

autocapitalizationType設定してもUITextAutocapitalizationTypeAllCharacters、ユーザーは Caps Lock を解除するために Caps キーを押すことができます。ユーザーがテキストの途中を編集するとtextField.text = [textField.text stringByReplacingCharactersInRange:range withString:[string uppercaseString]]; return NO;、編集ポイントが失われます ( の後textField.text =、編集カーソルが文字列の末尾に移動します)。

私は 2 つのソリューションを組み合わせて実行しましたが、これが私が提案するものです: setUITextAutocapitalizationTypeAllCharactersで、次のコードを のデリゲートに追加します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;
}
于 2011-06-07T13:06:06.007 に答える
33

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

ただし、良いニュースは、この問題の影響を受けないUITextField's (または's) のテキストの一部を置き換える直接的な方法があることです。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

于 2012-11-14T21:54:45.943 に答える
2

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

の中に

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

方法:

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

return NO;
于 2012-09-07T19:22:01.400 に答える
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;

}
于 2015-01-14T09:13:41.973 に答える