IPhoneのテキストボックスに入力した文字を大文字にする方法を教えてください。
autocapitalizationType
のUITextAutocapitalizationTypeAllCharacters
をUITextField
に設定します。
詳細は ITextInputTraitsプロトコル(UITextFieldで採用) を参照してください。
他のすべての回答は実際には機能しますが(入力は大文字になります)、カーソルの位置が保持されないという問題があります(既存のテキストの中央に文字を挿入してみてください)。これは明らかにUITextField
のtext
プロパティのセッターで発生し、プログラムで復元する方法が見つかりませんでした(たとえば、元の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
のドキュメントを参照してください。
最も簡単な方法は、テキストフィールドの変更された編集メソッドを実装し、テキストフィールドのテキスト値を入力されたテキストの大文字表現に設定することです。
- (IBAction)TextFieldEditingChanged:(id)sender
{
_yourTextField.text = [_yourTextField.text uppercaseString];
}
文字が大文字であるか小文字であるかをテストするのではなく、小文字であると想定してください。はるかに簡単です。
の中に
-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range
replacementString:(NSString *)string
方法:
NSString *newString = [[textField.text stringByAppendingString:string] uppercaseString];
textField.text = newString;
return NO;
たぶん、私はこの方法のすべての欠点を発見していませんが、これまでのところ、それは私にとってはうまくいきます。 [〜#〜] 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)
}
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;
}
私は以前の答え(ありがとう)に刺激を受けましたが、それらすべてにいくつかの欠陥がありました:
つまり、これは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: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;