2012-02-05 6 views
0

私のXcodeとObj-Cの知識はほとんどありませんので、私が愚か/間違って公式化された質問をするかどうか理解してください。IBoutlet collection.UIButton add target

インタフェースビルダーに一連のボタンを追加しました。 これらのボタンを関数にリンクしたい(ラベルのテキストを変更しようとする) しかし、各ボタンはある種のパラメータを送信することによってテキストを別々に変更することができるはずです。

-(IBAction)changeText:(NSString *) theString{ 
    myLabel.text=theString; 
} 

ボタンにアクションを追加すると、このようなものが使用されます。第二ボタンの

[but1 addTarget:self action:@selector(changeText : myString[1]) 
    forControlEvents:UIControlEventTouchUpInside]; 

[but2 addTarget:self action:@selector(changeText : myString[2]) 
    forControlEvents:UIControlEventTouchUpInside]; 

がようにANS ..

私の質問は: 私はボタンの数が多い場合、私はループ内でそれらを宣言することができますし、同時に適切な行動を加えてください。それ、どうやったら出来るの?

+0

あなたが提供したコードはコンパイルしますか? – Krizz

+0

あなたはこの種のものにIBOutletを使用したくないかもしれません。あなたはNSArrayのボタンを作りますが、IBOutletはそれらが存在することを知らないでしょう。 – Dair

+0

私の頭からコードを書いた。それはより多くの擬似コードです。私はちょうど主要なアイデアを説明したい。 –

答えて

2

ボタンで呼び出されるメソッドの形式は固定です。文字列のような任意のパラメータを渡すことはできません。何も渡せないか、ボタン自体を渡すだけです。

このコードはコンパイルされません。

[but1 addTarget:self action:@selector(changeText : myString[1]) forControlEvents:UIControlEventTouchUpInside]; 

のmyStringは、[1]の部分は、あなたのセレクタが無効になりますので。セレクタは単にメソッド名であり、パラメータを内部に入れることはできません。ボタンは、メソッドを呼び出すときに渡すパラメータを決定し、常にそのパラメータを渡します。あなたはこのように、あなたはそれぞれのボタンに独自の方法を与えることができる、2つの選択肢があります。私たちは、ボタンのパラメータを使用していないので、

[but1 addTarget:self action:@selector(changeText1) forControlEvents:UIControlEventTouchUpInside]; 
[but1 addTarget:self action:@selector(changeText2) forControlEvents:UIControlEventTouchUpInside]; 
etc... 

はchangeTextメソッドの最後にコロンがないことに注意してください。次に、メソッドを次のように定義します。

-(IBAction)changeText1 { 
    myLabel.text= myString[1]; 
} 

-(IBAction)changeText2 { 
    myLabel.text = myString[2]; 
} 

これはあまりスケーラビリティがありません。別の方法としては、コードを分岐するためのタイトルやタグなど、ボタンのプロパティを使用する方法があります。私はタグがあなたの目的のために働くと思う:今セレクター:

[but1 addTarget:self action:@selector(changeText:) forControlEvents:UIControlEventTouchUpInside]; 
but1.tag = 1; // this will match the index of the string you want to display 

注changeTextの末尾にコロンがあります。これは、メソッドを呼び出すときにボタンがパラメータとして渡されるようにすることを意味します。 changeTextメソッドは次のようになります。

-(IBAction)changeText:(UIButton *)theButton { 
    NSInteger stringIndex = theButton.tag; 
    myLabel.text = myString[stringIndex]; 
} 
+0

Anonはちょっといいところですが、IBActionはInterface Builderでバインドしない限り何も意味しないので、IBActionの代わりにメソッドを(void)として定義することができます。それでもどちらの方法でも動作します。 –

+0

また、Interface Builderでタグを設定できるので、IBでドラッグアンドドロップを使用してすべてのボタンを同じchangeTextメソッドにバインドし、コードループ内でそれらをすべてバインドする必要がなくなります。すべてのボタン用のコンセントを作成するか、コード内のタグですべてコンセントを取得します。 –

+0

これはまさに私が探していたものです。あなたは美しいです^^。ありがとうございました! –