web-dev-qa-db-ja.com

UItextfieldの大文字

iOS UIKeyboardについて質問があります。

UITextFieldがあり、大文字のみのkeyboardが必要です。

storyboardを使用し、Cpitalizationを「All characters」としてUITextField propertiesに設定しようとしました。

しかし、これは私の問題を解決しません...提案はありますか?

51
Safari

UITextFieldでテキストフィールドタイプautocapitalizationTypeUITextAutocapitalizationTypeAllCharactersに設定します

self.yourTexField.autocapitalizationType = UITextAutocapitalizationTypeAllCharacters;

コールデリゲート後

//デリゲートメソッド

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSRange lowercaseCharRange = [string rangeOfCharacterFromSet:[NSCharacterSet lowercaseLetterCharacterSet]];

    if (lowercaseCharRange.location != NSNotFound) {
        textField.text = [textField.text stringByReplacingCharactersInRange:range
                                                                 withString:[string uppercaseString]];
        return NO;
    }

    return YES;
}
92
codercat

Swiftバージョン。

Swift 4

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    textField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.uppercased())

    return false
}

元の回答

func textField(textField: UITextField, shouldChangeCharactersInRange range: NSRange, replacementString string: String) -> Bool {
    textField.text = (textField.text as NSString).stringByReplacingCharactersInRange(range, withString: string.uppercaseString)

    return false
}

Capitalization: All Charactersプロパティは、Caps Lockがオンの状態でキーボードを強制的に開きますが、ユーザーはそれをオフにできます。

19
Tim S

上記の回答のいくつかで私が抱えている問題の1つは、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
}
16
Dan

構文は今

スイフト2

textField.autocapitalizationType = UITextAutocapitalizationType.AllCharacters

スイフト3

textField.autocapitalizationType = .allCharacters
15
Eden

UITextFieldプロパティautocapitalizationTypeUITextAutocapitalizationTypeAllCharactersに設定します。これにより、すべての文字が大文字で表示されます。 こちら にアクセスして、テキストフィールドの詳細を確認してください

4
Adnan Aftab

これは私が使用した異なるアプローチで、次のことを行います。

  1. 文字が入力されるとすぐに大文字を使用します
  2. テキストフィールドが自動キャップに設定されていても、ユーザーがキャップロックを無効にする状況をキャッチします
  3. 簡単に編集できる
  4. Swift 2.2で動作します

最初に、テキストフィールドで変更が発生するたびに更新される通知を登録します。

    textField.addTarget(self, action: #selector(YourClassName.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)

次に、textFieldDidChangeを実装します。

func textFieldDidChange(textField: UITextField) {
    textField.text = textField.text?.uppercaseString
}

私はこれを選択して、ユーザーが大文字化された不均一な体験を見るが、次のキャラクターに移動すると変更される状況を回避しました。

4
CodeBender

Swift 4.0バージョン:

まず、大文字にするテキストフィールドのデリゲートを現在のViewControllerに設定します(テキストフィールドからcurrentViewControllerにドラッグしてデリゲートを設定します)。

拡張機能を追加した後:

extension CurrentViewController: UITextFieldDelegate{

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

        //refference to the textfield you want to target
        if textField.tag == 5{
            textField.text = (textField.text! as NSString).replacingCharacters(in: range, with: string.uppercased())
            return false
        }
        return true
    }
}

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

@property (nonatomic, strong) IBOutlet UITextField *yourTextfield

// add target in code or use interface builder
[self.yourTextField addTarget:self 
                       action:@selector(uppercaseTextField)
             forControlEvents:UIControlEventEditingChanged];

- (IBAction)uppercaseTextField:(UITextField*)textField
{
    textField.text = [textField.text uppercaseString];
}
1
Omkar Guhilot

ViewDidLoad/ViewDidAppearの1行のコード:

ViewDidLoad/ViewDidAppearのいずれかのコードの下にあるすべての大文字/大文字の大文字/小文字に関係なく、入力した文字を単に表示したい場合

self.MyTextField.autocapitalizationType = .allCharacters

上記の行は、自動的に入力している間、すべての文字を大文字に変更します

1
vilas deshmukh

このコードを使用することもできます。

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

    // Uppercase for string which you need 
    textField.text = [textField.text stringByReplacingCharactersInRange:range 
                                 withString:[string uppercaseString]];

    // return NO because You have already done it in above code
    return NO;
}
1
Linh Nguyen

最後に、UITextFieldの文字列の途中でテキストを編集することも尊重する方法を見つけました。

問題は、テキスト全体を_UITextFiled.text_プロパティで置き換えると、実際のカーソルがテキストの最後に移動することです。したがって、.replace()メソッドを使用して、upperCaseに更新する文字を正確に指定する必要があります。

最後に、関数の戻り値として_string.isEmpty_を返すことです。そうしないと、テキストの削除が許可されません。

_func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    if let text = textField.text, let textRange = Range(range, in: text) {
        let uppercasedString = string.uppercased()
        let updatedText = text.replacingCharacters(in: textRange, with: uppercasedString)
        if let selectedTextRange = textField.selectedTextRange {
            textField.replace(selectedTextRange, withText: uppercasedString)
            approveButtonState(vin: updatedText)
        }
        return string.isEmpty
    }
    return false
}
_
1
Marek Staňa

ここに私の状況と、上のテキストを強制するために達成した方法があります:

  • カスタムクラス(UITextFieldサブクラス)
  • デリゲートUITextFieldDelegateメソッドを使用したくない

@CodeBenderから提案されたソリューションは、私が探していたものとほぼ同じでしたが、@ Danから気づいたように、カーソルは常に最後にジャンプします。

class MyCustomTextField: UITextField {
...
addTarget(self, action: #selector(upperText), for: .editingChanged)
...
...
@objc private func upperText() {
    let textRange = selectedTextRange
    text = text?.uppercased()
    selectedTextRange = textRange
}

これにより、ユーザーが「中央」にテキストを追加しても、カーソルは常に正しい位置(以前の位置)に設定されます。

0
magpie
/**
 We take full control of the text entered so that lowercase cannot be inserted
 we replace lowercase to uppercase
*/
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {

    // No spaces allowed
    if string == " " {
        return false
    }

    // delete key pressed
    if string == "" {
        textField.deleteBackward()
        return false
    }

    // We only allow alphabet and numbers
    let numbersAndLettersSet = CharacterSet.alphanumerics
    if string.lowercased().rangeOfCharacter(from: numbersAndLettersSet) == nil {
        return false
    }

    // Add the entered text
    textField.insertText(string.uppercased())

    // Return false as we are doing full control
    return false
}
0
Chris

ここでの回答には少し遅れているかもしれませんが、実用的なソリューションがあるので、誰かがそれを役に立つと思うかもしれません。

さて、次のテキストフィールドデリゲートメソッドで、新しい文字列に小文字が含まれているかどうかを確認してください。その場合、次に:

  • 入力したばかりの文字をテキストフィールドのテキストに追加します。
  • すべてのテキストフィールドのテキストを大文字にします。
  • メソッドからfalseが返されることを確認してください。

それ以外の場合は、trueを返し、メソッドを期待どおりに動作させます。

その実装は次のとおりです。

func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
    var returnValue = true
    let lowercaseRange = string.rangeOfCharacter(from: CharacterSet.lowercaseLetters)
    if let _ = lowercaseRange?.isEmpty {
        returnValue = false
    }

    if !returnValue {
        textField.text = (textField.text! + string).uppercased()
    }

    return returnValue
}

上記は私にとって完璧に機能し、同様の実装はもちろん最初に適切な調整を行った後、テキストビューでも機能します。

それが役に立てば幸い!

0
Gabb