为了澄清我的问题,我的程序在屏幕上有三个灯泡(自定义UIButton) 当按下任何灯泡时,我以编程方式生成一个带开关的UIView 当我打开开关时,相应的灯泡会亮起(改变它的背景图像) 但是,我无法访问此UISwitch,因为我无法公开声明它
我的代码是这样的:
@property buttonA;
@synthesize buttonA;//all three buttons have their background image set to 'off.png'
- (IBAction)lightBulbPressed:(UIButton *)sender
{
UIView *myView = [[UIView alloc] initWithFrame:CGRectMake(1,1, 64, 64)];
UISwitch *mySwitch = [[UISwitch alloc] initWithFrame:CGRectMake(0,0,64,64)];
[mySwitch addTarget:self action:@selector(onOrOff) forControlEvents:UIControlEventValueChanged];
[myView addSubview:mySwitch]
[self.view addSubview:myView];
}
令我烦恼的是如何对选择器onOrOff进行编程,以便它知道正在触摸哪个开关并相应地更改相应按钮的背景图像。
答案 0 :(得分:0)
这样做的一种方法是,在IB中为它们提供不同的标记号,并在- (IBAction)lightBulbPressed:(UIButton *)sender
方法中获取它们的标记。例如NSInteger pressedButtonTag = [sender tag];
,然后从那里开始。
此外,每次用户按下按钮时,不是使用alloc / init myView
,而是可以在IB中添加该视图,将切换添加到它,放入所有者的层次结构但不包含视图,并设置在.h的出口。在您需要时随时拨打电话,然后再按标签访问交换机,例如(UISwitch *mySwitch = (UISwitch *)[myView viewWithTag:kSwitchTag];
)并执行您想要执行的操作(打开或关闭),将其添加到子视图中并稍后将其删除。这样效率更高。
答案 1 :(得分:0)
想想你的方法:
- (IBAction)lightBulbPressed:(UIButton *)sender {
// your method
}
你已经知道是谁打过电话了。这条信息存储在sender
中。
因此,您可以将其保存并稍后在onOrOff
顺便说一句,如果你使用的是UISwitch,你必须检查
UIControlEventValueChanged
而不是UIControlEventTouchUpInside。
编辑:要传递sender
,您可以将其值存储到.h文件中声明的NSString *buttonTapped
- (IBAction)lightBulbPressed:(UIButton *)sender {
if (sender == bttOne) {
buttonTapped = @"ButtonOneTapped";
} else if (sender == bttTwo) {
buttonTapped = @"ButtonTwoTapped";
} else if (sender == bttThree) {
buttonTapped = @"ButtonThreeTapped";
}
// your method
}
- (void)onOrOff {
if ([buttonTapped isEqualToString:@"ButtonOneTapped"]) {
// Button One
} else if ([buttonTapped isEqualToString:@"ButtonTwoTapped"]) {
// Button Two
} else if ([buttonTapped isEqualToString:@"ButtonThreeTapped"]) {
// Button Three
}
}