2010-12-15 9 views
0

ビューコントローラでは、すべて同じデリゲートを使用する複数のテキストフィールドがあります。デリゲートでは、すべてのテキストフィールド(if/else-ifまたはswitch文の束)を区別する必要があるため、コードは実際には醜いものになります。iPhoneのブロックを使用してデリゲートを設定する

Blocks in textfield delegates

しかし、このことから、私はまだこの問題を解決する方法を理解していない:私はクロスにこの記事を来ましたか?これは基本的に1つのメソッドを呼び出してテキストを渡すのではなく、テキストフィールドが文字列をどのように与えたかは分かりません。あなたはまだテキストフィールドを区別する必要がありますが、この時間はブロック内にあります(通常のif(textfield == bazTextField)...)。

+0

私はこのことをとてもうまく理解していませんが、私はそのブログ記事を読んだ後で同じ質問をしたでしょう。ブロガーに直接お問い合わせください。 – chris

答えて

1

私はそれが問題を解決するのと同じくらい、それをずらすだけではよく分かりません(とにかく、通常はそれにマッシュマッシュが入るviewDidLoadに)。

しかし、この例では、ブロック自体がテキストフィールドに渡されて、すべてのインスタンス変数の値との比較や「記憶」も実行されていました。テキストフィールドが処理されています。

テキストフィールドのデリゲートすべてで使用される単一のデリゲートクラスに1つのブロックを割り当てているため、コードがどのように役立つと思われますか?それぞれ異なるブロックがあります。 if文を使った場合よりもコードの方が多くなります!

+0

最後に私は同じ結論に達しました。それはちょうど恐ろしい場所に混乱をシフトするだけです。 – Guu

0

この記事では明らかになっていませんが、私は考えているのは、textFieldShouldReturnに応答したい各UITextFieldに対してこれらのブロック(および代理オブジェクトをブロックする)を作成することだと思います。

0

hm、多分私は記事を完全に理解していないかもしれませんが、具体的な例でセレクタの代わりにブロックを使用する利点はありません。それはしかしif-elseの連鎖よりも良くなるかどう あなたはこの

@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 

のような似たような達成できる本当に知りません。
これは、これが解決する問題よりも複雑になるようです。

+0

いくつかのUITextFieldを持つ単純な状況の場合、私はそれが複雑であることに同意します。私は解決策の目標は、おそらく10以上のフィールドが関わっている状況だと思います。記事への私の最初の反応も、セレクターで行うことができたということでした。したがって、セレクタやブロックを使用するかどうかは、おそらくコードを配置する場所としての個人的な好みです。 – drekka

関連する問題