iOS UIKeyboard
について質問があります。
UITextField
があり、大文字のみのkeyboard
が必要です。
storyboard
を使用し、Cpitalization
を「All characters
」としてUITextField properties
に設定しようとしました。
しかし、これは私の問題を解決しません...提案はありますか?
UITextFieldでテキストフィールドタイプautocapitalizationType
をUITextAutocapitalizationTypeAllCharacters
に設定します
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;
}
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がオンの状態でキーボードを強制的に開きますが、ユーザーはそれをオフにできます。
上記の回答のいくつかで私が抱えている問題の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
}
構文は今
スイフト2
textField.autocapitalizationType = UITextAutocapitalizationType.AllCharacters
スイフト3
textField.autocapitalizationType = .allCharacters
UITextField
プロパティautocapitalizationType
をUITextAutocapitalizationTypeAllCharacters
に設定します。これにより、すべての文字が大文字で表示されます。 こちら にアクセスして、テキストフィールドの詳細を確認してください
これは私が使用した異なるアプローチで、次のことを行います。
最初に、テキストフィールドで変更が発生するたびに更新される通知を登録します。
textField.addTarget(self, action: #selector(YourClassName.textFieldDidChange(_:)), forControlEvents: UIControlEvents.EditingChanged)
次に、textFieldDidChange
を実装します。
func textFieldDidChange(textField: UITextField) {
textField.text = textField.text?.uppercaseString
}
私はこれを選択して、ユーザーが大文字化された不均一な体験を見るが、次のキャラクターに移動すると変更される状況を回避しました。
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];
}
ViewDidLoad/ViewDidAppearのいずれかのコードの下にあるすべての大文字/大文字の大文字/小文字に関係なく、入力した文字を単に表示したい場合
self.MyTextField.autocapitalizationType = .allCharacters
上記の行は、自動的に入力している間、すべての文字を大文字に変更します
このコードを使用することもできます。
-(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;
}
最後に、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
}
_
ここに私の状況と、上のテキストを強制するために達成した方法があります:
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
}
これにより、ユーザーが「中央」にテキストを追加しても、カーソルは常に正しい位置(以前の位置)に設定されます。
/**
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
}
ここでの回答には少し遅れているかもしれませんが、実用的なソリューションがあるので、誰かがそれを役に立つと思うかもしれません。
さて、次のテキストフィールドデリゲートメソッドで、新しい文字列に小文字が含まれているかどうかを確認してください。その場合、次に:
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
}
上記は私にとって完璧に機能し、同様の実装はもちろん最初に適切な調整を行った後、テキストビューでも機能します。
それが役に立てば幸い!