私はこのパーティーに少し遅れていることを認識していますが、CustomDelegate クラスを Interface Builder の VC に追加し、デリゲートをそれに設定UITextField
してみませんか? VC に余分なコードは必要なく、UITextField
サブクラス化も必要ありません。以下のプロジェクトのリンクは、電話番号をカスタムフォーマットするためにこれを行います。
サンプル プロジェクトへ のリンク このリンクは、私が削除すると決定した時点で削除されます。永遠に (または Dropbox が存続している限り) 存続する可能性があります。
デリゲート クラスのコード例を追加しました (ただし、誰かが iOS 開発の経験があれば、これは必要ありません)。そのスクリーンショットは、ほぼすべての答えを説明しています。便宜上、サンプル プロジェクトのリンクを追加しました。
Delegate クラスのコード:
ヘッダー ファイル:
#import <Foundation/Foundation.h>
@interface PhoneNumberFormatterDelegate : NSObject <UITextFieldDelegate>
@end
実装ファイル:
#import "PhoneNumberFormatterDelegate.h"
@implementation PhoneNumberFormatterDelegate
#pragma mark - My Methods
-(void)textFieldDidChange:(UITextField *)textField {
if ([textField.text length] > 11) {
[textField resignFirstResponder];
}
}
#pragma mark - UITextField Delegate Methods
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
// If user hit the Done button, resign first responder
if([string isEqualToString:@"\n"]){
[textField resignFirstResponder];
return NO;
}
// All digits entered
if (range.location == 12) {
[textField resignFirstResponder];
return NO;
}
// Reject appending non-digit characters
if (range.length == 0 &&
![[NSCharacterSet decimalDigitCharacterSet] characterIsMember:[string characterAtIndex:0]]) {
return NO;
}
// Auto-add hyphen before appending 4rd or 7th digit
if (range.length == 0 &&
(range.location == 3 || range.location == 7)) {
textField.text = [NSString stringWithFormat:@"%@-%@", textField.text, string];
return NO;
}
// Delete hyphen when deleting its trailing digit
if (range.length == 1 &&
(range.location == 4 || range.location == 8)) {
range.location--;
range.length = 2;
textField.text = [textField.text stringByReplacingCharactersInRange:range withString:@""];
return NO;
}
return YES;
}
- (void)textFieldDidBeginEditing:(UITextField *)textField {
[textField addTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}
- (void)textFieldDidEndEditing:(UITextField *)textField {
[textField removeTarget:self action:@selector(textFieldDidChange:) forControlEvents:UIControlEventEditingChanged];
}
@end