iPhone のテキスト ボックスに入力する文字を強制的に大文字にするにはどうすればよいですか?
11 に答える
に設定autocapitalizationType
しUITextAutocapitalizationTypeAllCharacters
ますUITextField
。
詳細については、UITextInputTraits プロトコル (UITextField で採用)を参照してください。
この解決策は、完全に満足できるものではありません。
に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;
}
他のすべての回答は実際には機能しますが (入力を大文字にします)、カーソル位置が保持されないという問題があります (既存のテキストの途中に文字を挿入してみてください)。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
。
文字が大文字か小文字かをテストするのではなく、小文字であると想定してください。はるかに簡単です。
の中に
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
方法:
NSString *newString = [[textField.text stringByAppendingString:string] uppercaseString];
textField.text = newString;
return NO;
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;
}