私のプロジェクトでは、40個のボタンのアクションを制御する必要がありますが、40個のIBActionを作成したくないのですが、IBActionのみを使用できますか?
インターフェイスビルダーを使用してボタンを作成している場合は、関連するクラスの同じIBActionを指すようにします。
その後、ボタンからテキストを読み取ることにより、IBActionメソッド内のボタンを区別できます。
- (IBAction)buttonClicked:(id)sender {
NSLog(@"Button pressed: %@", [sender currentTitle]);
}
...またはXcodeでtag
プロパティを設定し、[sender tag]
を介してそれを読み取ることにより。 (このアプローチを使用する場合、0がデフォルトであり、したがってほとんど使用されないため、タグを1から開始します。)
-(IBAction)myButtonAction:(id)sender {
if ([sender tag] == 0) {
// do something here
}
if ([sender tag] == 1) {
// Do something here
}
}
// in Other words
-(IBAction)myButtonAction:(id)sender {
switch ([sender tag]) {
case 0:
// Do something here
break;
case 1:
// Do something here
break;
default:
NSLog(@"Default Message here");
break;
}
その1つのアクションを使用するようにすべてのボタンを設定します。通常、アクションにはsender
パラメーターがあり、これを使用して、どのボタンがアクションを呼び出しているかを判別できます。ボタンの違いを判断する一般的な方法の1つは、各ボタンのtag
プロパティに異なる値を割り当てることです。したがって、1〜40の範囲のタグを持つ40個のボタンがあります。(0は、デフォルト値であり、タグを設定するのを忘れたボタンは、タグ値。)
この手法は、電卓やキーボードのボタンなど、すべてのボタンがほぼ同じことを行う場合に最も役立ちます。各ボタンがまったく異なる動作をする場合、40個のメソッドに相当する結果になりますが、Objective-Cのメッセージングシステムの代わりに独自のswitchステートメントを使用します。その場合、必要なだけ多くのアクションを作成するために時間を費やす方が適切な場合が多くあります。
確かに。 Interface Builderですべてのボタンを同じアクションメソッドに接続するだけです。メソッドのsender
引数(おそらくボタンのtag
プロパティと組み合わせて)を使用して、イベントを送信しているボタンを特定します。
上記の方法を自分で使用し、ボタンを選択しましたが、すべてを変換し、代わりにスイッチケースを使用しました
-(IBAction)buttons:(id)sender
{
switch ([sender tag])
{
case 0 :
}
}
1つのIBActionを使用して、それをすべてのボタンに割り当てます。
必要な答えはすべて手に入れているようですが、他の人の答えに加えたいと思います。
1つのIBActionを使用するか、40のアクションを使用するかは、ボタンで何をするかによって決まります。すべてのボタンの機能がまったく異なる場合は、すべての個別のIBActionが必要ですが、すべてのボタンで同じことを実行する場合は、1つだけを使用できます。これらのボタンとアクションの詳細が必要ですが、おそらく各ボタンのタイトルがあるので、それを使用して各ボタンを区別し、押された特定のボタンによってカスタマイズされるメッセージまたは何かを作成できます。以下に例を示します。ボタンを押すたびに、ラベルには「ボタンのタイトル」というメッセージが表示されます。
このようにすることで、40パターンすべてで大文字と小文字を切り替える必要がなくなります。わずか2〜3行のコードでボタンを押すことで個別化された何かを表示または実行できます。
- (IBAction)button_Clicked:(UIButton *)sender {
//Get the buttons' titles.
NSString *title =[sender titleForState:UIControlStateNormal];
//Construct a message that includes the *title.
NSString *plainText=[NSString stringWithFormat:@"%@ button pressed.", title];
//Assigns the *plainText to the label.
self.Label.text=plainText;
}
@end