2009-07-06 6 views
2

私は、送信者を受け入れ、UIbuttonで呼び出されるメソッドを持っています。そのオブジェクトをUIImageViewにキャストする方法を教えてください。基本的にボタンのコードを再利用するにはどうすればいいですか?キャスト送信者パラメータ

- (IBAction)startClick:(id)sender { 
    button.animationImages = [NSArray arrayWithObjects: 
             [UIImage imageNamed:@"Pic_1.png"], 
             [UIImage imageNamed:@"Pic_2.png"], 
             [UIImage imageNamed:@"Pic_3.png"], 
             nil]; 
    [button setAnimationRepeatCount:1]; 
    button.animationDuration = 1; 
    [button startAnimating]; 
} 
+0

これは以前の質問と重複しています。http:// stackoverflow。com/questions/1088481/sender-tag –

答えて

3

私の最初の応答はおそらくそれを行う間違いであるということです。 UIButtonUIImageViewUIViewの別個のサブクラスであり(UIButtonUIControlのサブクラスです)、共通の唯一のものはUIViewのメソッドです。 senderが実際にUIButtonである場合、UIImageViewとして処理すると、「インスタンスに送信されたセレクタが認識されない」などのエラーが発生する可能性があります。

一般的に、よりクリーンな解決策は、UIImageViewのアクションである別の方法を作成することです。 (Javaとは異なり、Objective-CとCocoaは、イベントタイプに基づいてUIレスポンスコードを単一のメソッドに振りかざすのではなく、実行する必要のある操作に基づいてコードを論理的に整理します。ボタンと画像ビューの両方からこのメソッドを呼び出すと、次のようにロジックを区切ることができます。

- (IBAction) startClick:(id)sender { 
    if ([sender isKindOfClass:UIButton]) { 
    ... 
    } 
    else if ([sender isKindOfClass:UIImageView]) { 
    ... 
    } 
} 
+0

もし私が - (IBAction)を使うことができたなら、私はここに投稿できませんでした:)しかし問題は、このボタンは別のクラスにあります。私はそのクラスでIBActionを作れません。 – chostDevil

+0

" if([送信者isKindOfClass:[UIButtonクラス]]){...} "。大括弧と 'クラス'が含まれています。 – Priebe

1

私はこれをやったと思います。

これは動作するはずです。そうでなければ、あなたが望むこの方法では、ボタンをキャストする必要があり

(IBAction)startClick:(UIButton *)theButton 

に機能を変更した方がよいかもしれません。

+0

後者の提案はおそらく動作しません。 IBアクションメソッドは常に戻り値の型 "IBAction"(voidとして定義されます)を持ち、パラメータの型はidです。 –

1

ボタンのコンセントはありますか?ボタンは、-startClickを送信する唯一のUI要素ですか?もしそうなら、次のようにアクションメソッドを記述します。

- (IBAction)startClick:(id)sender { 
    NSParameterAssert(sender == self.startClickButton); 
    if (sender == self.startClickButton) { 
     UIButton *button = self.startClickButton; 
     [...] 
    } 
} 

あなたはボタンのための出口/プロパティを持っていない場合は、送信者のクラスをテストすることができ、かつ適切な場合にはキャスト。

- (IBAction)startClick:(id)sender { 
    NSParameterAssert([sender isKindOfClass: [UIButton class]]); 
    if ([sender isKindOfClass: [UIButton class]]) { 
     UIButton *button = (UIButton *)sender; 
     [...] 
    } 
} 

最後に、(コンパイル時に)id型の値に任意のメッセージを送信することができます。 (受信者がそのメッセージに応答しない場合は、実行時に例外が発生します)。ただし、ドット構文は使用できません。

送信者が常にボタンであることがわかっている場合は、キャストせずにメソッドを記述することができます。ドット構文の代わりにメッセージを送る必要があります。

[button setAnimationImages: [NSArray ...]]; 
[button setAnimationDuration: 1]; 

ドットシンタックスはメッセージ送信シンタックスと同等ですが、これは神秘的ではありません。

のNSLog:あなただけのボタンのラベルを取得し、クリックされたかを決定するために、以下を使用することができます

0

(@ "クリックされたボタン:%@"、[[差出人titleLabel]テキストを]);

こちらがお役に立てば幸いです。

Suresh

関連する問題