0

ビュー コントローラーには複数のテキスト フィールドがあり、それらはすべて同じデリゲートを使用します。デリゲートでは、すべてのテキストフィールド (多数の if/else-if または switch ステートメント) を区別する必要があるため、コードは非常に見苦しくなります。私はこの記事にクロスしました:

テキストフィールド デリゲートのブロック

しかし、これから、これがどのように問題を解決するのかまだわかりませんか?これは基本的に1つのメソッドを呼び出してテキストを渡し、メソッドはどのテキストフィールドが文字列を与えたのかわかりませんか? それでもテキストフィールドを区別する必要がありますが、今回はブロック内です (通常の if(textfield == bazTextField)... を使用)。

4

3 に答える 3

1

それが問題をシフトするほど正確に解決するかどうかはわかりません(そしてviewDidLoadに移動しますが、通常はとにかくマッシュマッシュが少し入ります)。

ただし、その例では、ブロック自体がテキストフィールドに渡されて比較が実行され、すべてのインスタンス変数の値も (参照されている場合) 「記憶」されているため、テキストとテキストフィールドが何であるかを知る方法です。対処した。

ただし、すべてのテキスト フィールド デリゲートで使用される単一のデリゲート クラスに 1 つのブロックを割り当てるため、そのコードがどのように役立つかはわかりません。おそらく、テキスト フィールドごとに 1 つ、それぞれ異なるブロック。そうすれば、if ステートメントよりもはるかに多くのコードを使用できます。

于 2010-12-15T22:33:47.507 に答える
0

うーん、記事を完全には理解していなかったかもしれませんが、その具体的な例では、セレクターの代わりにブロックを使用する利点がわかりません。あなたはこのようなものを達成することができます

@interface AlternativeTextFieldDelegate : NSObject <UITextFieldDelegate>
{
    SEL selectorToCall;
    id objectToCall;
}
- (void) setObjectToCall:(id)obj selector:(SEL)selector;
@end

@implementation AlternativeTextFieldDelegate

- (void) setObjectToCall:(id)obj selector:(SEL)selector
{
    objectToCall = obj;
    selectorToCall = selector;
}
- (BOOL)textFieldShouldReturn:(UITextField *)textField
{
    [objectToCall performSelector:selectorToCall];
    return YES;
}

@end

そしてビューコントローラー

@interface ViewWithTextFieldsController : UIViewController
{
    UITextField *tf1;
    AlternativeTextFieldDelegate *delegateForTF1;
    UITextField *tf2;
    AlternativeTextFieldDelegate *delegateForTF2;
}
// ...IBOutlets and all that...

- (void) tf1ShouldReturn; // handles shouldReturn for tf1
- (void) tf2ShouldReturn; // handles shouldReturn for tf2

@end

@implementation ViewWithTextFieldsController

- (void) viewDidLoad // or wherever
{
    delegateForTF1 = [[AlternativeTextFieldDelegate alloc] init];
    [delegateForTF1 setObjectToCall:self selector:@selector(tf1ShouldReturn)];
    tf1.delegate = delegateForTF1;

    delegateForTF2 = [[AlternativeTextFieldDelegate alloc] init];
    [delegateForTF2 setObjectToCall:self selector:@selector(tf2ShouldReturn)];
    tf2.delegate = delegateForTF2;
}
// ...

@end

ただし、それが sをチェーンするよりも優れているかどうかはわかりませんif-else
これは、解決する問題よりも物事を複雑にしているように私には思えます。

于 2010-12-15T19:52:09.633 に答える
0

この記事では明確にしていませんが、textFieldShouldReturn に応答させたい UITextField ごとに、これらのブロックの 1 つを作成する (およびデリゲート オブジェクトをブロックする) ことが考えられると思います。

于 2010-12-15T19:24:21.723 に答える