我有以下 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;
}
}
或者检查开关是否是您的控制器属性之一
- (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 属性。但是您可以将其子类化并为子类添加名称属性。然后从子类而不是 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 提到的将开关的指针与控制器的属性进行比较以确定哪个开关发生了变化。这就是我在我的代码中所做的。从长远来看,标签和名称太容易出错。
我不感谢你能得到那个开关的名字。您可以标记每个开关,并使用该标记来确定开关的名称。