11

UITextFieldaを 4 文字に制限してカスタマイズしたいと思います。デリゲートがどのように機能するかを理解しようとしObjective-Cており、次の手順を実行してこの機能を実装しましたが、まだうまく機能するソリューションが得られていません。

1) LimitedLengthTextField Objective-C クラスを作成しました。タイプのクラスをUITextField作成し、タイプ < UITextFieldDelegate > のオブジェクトを受け入れます。

LimitedLengthTextField.h:

@interface LimitedLengthTextField : UITextField <UITextFieldDelegate>
@end

2) LimitedLengthTextField.m に次のメソッドを実装しました。

@implementation LimitedLengthTextField

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 4) ? NO : YES;
}

@end

3) CreateAccount クラスに "LimitedLengthTextField.h" をインポートし、次のように UITextField "ssnTextField" のデリゲートを設定しようとしましたviewDidLoad(私のアプリはユーザーの SSN の最後の 4 桁を受け入れます)。

// Set the custom SSN textfield delegate
LimitedLengthTextField *custTextField = [[LimitedLengthTextField alloc] init];
[self.ssnTextField setDelegate:custTextField];

とデリゲートに関する私の限られた理解に基づいてObjective-C、クラスを作成し、必要なデリゲート メソッドを実装してから、そのクラスのインスタンスを作成し、それを UITextView オブジェクトに割り当てました。私は何が欠けていますか?

4

4 に答える 4

21

UITextField をサブクラス化しないでください。代わりに、CreateAccount クラスにコールバックを実装します。したがって、次のようなものが必要です。

@interface CreateAccount :UIViewController <UITextFieldDelegate>
// I use UIViewController but whatever your CreateAccount from.

これを CreateAccount.m ファイルに実装します。

これはおそらくあなたの viewDidLoad メソッドにあります:

Self.cusTextField.delegate = self;

この

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    NSUInteger newLength = [textField.text length] + [string length] - range.length;
    return (newLength > 4) ? NO : YES;
}
于 2012-08-07T02:59:43.220 に答える
2

UITextFieldDelegateカスタムテキストフィールドの代わりにCreateAccount(テキストフィールドを含むView Controllerだと思いますか?)を準拠させshouldChangeCharactersInRange、CreateAccountクラスにもメソッドを実装する必要があるかもしれません。また、デリゲートをに変更します

_ssn.delegate = self;

この場合、カスタム テキスト フィールドはまったく必要ないかもしれません。

于 2012-08-06T23:13:21.203 に答える
0

そのメソッドを実装するテキスト フィールドは、LimitedLengthTextField 型である必要があります。他のものをUITextFieldタイプにするだけです

于 2012-08-06T23:20:18.613 に答える
0

現在のスコープの最後に割り当てが解除されると思われるローカル オブジェクトにデリゲートを設定しています。デリゲートが少なくとも対応するオブジェクトと同じくらい存続することを確認する責任があります。より良い方法は、ビュー コントローラーにデリゲート メソッドを実装し、カスタム フィールドのデリゲートをそれに設定することです。それはその 1 つにのみ影響し、他のものには影響しません。もう 1 つの方法は、デリゲートをプライベート クラスで内部的に実装することです。その後、クラスを設定するだけで完了です。

于 2012-08-07T00:41:35.033 に答える