iOS
UITextFieldデリゲート
サーチ…
UITextField - テキストフィールドを特定の文字に制限する
テキストフィールドのユーザー入力検証を実行する場合は、次のコードスニペットを使用します。
// MARK: - UITextFieldDelegate
let allowedCharacters = CharacterSet(charactersIn:"0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvxyz").inverted
func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
let components = string.components(separatedBy: allowedCharacters)
let filtered = components.joined(separator: "")
if string == filtered {
return true
} else {
return false
}
}
目標-C
#define ACCEPTABLE_CHARACTERS @"0123456789 ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSCharacterSet *cs = [[NSCharacterSet characterSetWithCharactersInString:ACCEPTABLE_CHARACTERS] invertedSet];
NSString *filtered = [[string componentsSeparatedByCharactersInSet:cs] componentsJoinedByString:@""];
return [string isEqualToString:filtered];
}
また、Appleが提供する文字セットを使用して検証を実行することもできます。
https://developer.apple.com/reference/foundation/nscharactersetをご覧ください
let allowedCharacters = CharacterSet.alphanumerics.inverted
let allowedCharacters = CharacterSet.capitalizedLetters.inverted
次のタグの検索とキーボードの管理
テキストフィールドは異なるデリゲートメソッドを呼び出します(デリゲートが設定されている場合のみ)。textfieldによって呼び出されるデリゲートメソッドの1つは* - (BOOL)textFieldShouldReturn:(UITextField )textField
このメソッドは、ユーザーが戻りボタンをタップするたびに呼び出されます。このメソッドを使用して、カスタム動作を実装できます。
例えば、
以下の例では、タグに基づいて次のレスポンダを見つけてキーボードを管理します。ここで20は定数、テキストフィールドに割り当てられたAsタグは50,70,90などと同じです
ここでレスポンダとして新しいテキストフィールドオブジェクトを見つけると、現在のテキストフィールドを新しいレスポンダとして作成し、それに応じてキーボードを開きます。
- (BOOL)textFieldShouldReturn:(UITextField *)textField {
NSInteger nextTag = textField.tag+20;
// Try to find next responder
UIResponder *nextResponder = [textField.superview viewWithTag:nextTag];
if (nextResponder)
{
// Found next responder, so set it.
[nextResponder becomeFirstResponder];
}
else
{
// Not found, so remove keyboard.
[textField resignFirstResponder];
}
return YES;
}
ユーザーがテキストフィールドとのやり取りを開始/終了したときのアクション
スイフト3.1の場合:
最初の例では、書き込み中にテキストフィールドとやり取りするユーザーを傍受する方法を確認できます。同様に、 UITextFieldDelegateには、ユーザーがTextFieldとのやり取りを開始し終了したときに呼び出されるメソッドがあります。
これらのメソッドにアクセスするには、 UITextFieldDelegateプロトコルに準拠する必要があります。通知するテキストフィールドごとに、親クラスをデリゲートとして割り当てます。
class SomeClass: UITextFieldDelegate {
@IBOutlet var textField: UITextField!
override func viewDidLoad() {
super.viewDidLoad()
textField.delegate = self
}
}
これですべてのUITextFieldDelegateメソッドを実装できます。
ユーザーがテキストフィールドの編集を開始したときに通知を受けるには、次のようにtextFieldDidBeginEditing(_ :)メソッドを実装できます。
func textFieldDidBeginEditing(_ textField: UITextField) {
// now you can perform some action
// if you have multiple textfields in a class,
// you can compare them here to handle each one separately
if textField == emailTextField {
// e.g. validate email
}
else if textField == passwordTextField {
// e.g. validate password
}
}
同様に、ユーザーがテキストフィールドとの対話を終了したかどうかを通知されている場合は、次のようにtextFieldDidEndEditing(_ :)メソッドを使用できます。
func textFieldDidEndEditing(_ textField: UITextField) {
// now you can perform some action
// if you have multiple textfields in a class,
// you can compare them here to handle each one separately
if textField == emailTextField {
// e.g. validate email
}
else if textField == passwordTextField {
// e.g. validate password
}
}
TextFieldの編集を開始/終了するかどうかを制御したい場合、 textFieldShouldBeginEditing(_ :)およびtextFieldShouldEndEditing(_ :)メソッドは、必要なロジックに基づいてtrue / falseを返すことによって使用できます。