アプリケーションのいくつかのスイッチにリンクされている次の IBAction があります。どのスイッチがクリックされているかを把握したいと思います。各 UISwitch には特定の名前があります。その名前が欲しい。
- (IBAction)valueChanged:(UISwitch *)theSwitch { //Get name of switch and do something... }
IBAction は、アクションを実行したスイッチにポインターを渡します。そこからあらゆる財産を手に入れることができます。
スイッチを比較するには:
- (void)valueChanged:(UISwitch *)theSwitch {
if ([theSwitch isEqual:self.switch1]) {
NSLog(@"The first switch was toggled!");
}
else if ([theSwitch isEqual:self.switch2]) {
NSLog(@"The second switch was toggled!");
}
else {
NSLog(@"Some other switch was toggled!");
}
}
次のいずれかのタグを使用できます。
スイッチを作成するときは、タグを設定する必要があります。
- (IBAction)valueChanged:(UISwitch *)theSwitch {
switch(theSwitch.tag){
case 0:
{
//things to be done when the switch with tag 0 changes value
}
break;
case 1:
{
//things to be done when the switch with tag 0 changes value
}
break;
// ...
default:
break;
}
}
または、スイッチがコントローラーのプロパティの 1 つであるかどうかを確認します
- (IBAction)valueChanged:(UISwitch *)theSwitch {
if(theSwitch == self.switch1){
//things to be done when the switch1 changes value
} else if (theSwitch == self.switch2) {
//things to be done when the switch2 changes value
}// test all the cases you have
}
UISwitch には name プロパティがありません。ただし、それをサブクラス化し、サブクラスに name プロパティを追加できます。次に、UISwitch の代わりにサブクラスからスイッチを作成し、初期化時に名前を付けます。
@class MySwitch : UISwitch
@property (nonatomic, retain) NSString* name;
@end
その後、イベント ハンドラーは名前文字列にアクセスできます。
- (IBAction)valueChanged:(MySwitch *)theSwitch {
NSLog(@"switch %@ value changed", theSwitch.name);
}
しかし、より良い答えは、既存のタグフィールドを使用し、文字列ではなく整数タグを使用してスイッチを識別することだと思います。コードで列挙定数を作成して、タグ値に名前を付けることができます。
enum { SomeSwitch = 1, AnotherSwitch = 2, MainSwitch = 3 } _SwitchTags;
最良の答えは、スイッチのポインターをコントローラーのプロパティと比較して、どのスイッチが変更されたかを判断するために@Moxyが言及したものです。それが私のコードで行うことです。タグと名前は、長期的にはエラーが発生しやすいものです。
そのスイッチの名前を取得できることに感謝します。各スイッチにタグを付け、そのタグを使用してスイッチの名前を決定できます。