【问题标题】:iPhone - call UISwitch that is generated in a UIView when a button is pressediPhone - 按下按钮时调用在 UIView 中生成的 UISwitch
【发布时间】:2012-01-25 18:26:48
【问题描述】:

为了澄清我的问题,我的程序在屏幕上有三个灯泡(自定义 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,让它知道哪个开关被触摸,并相应地改变相应按钮的背景图像。

【问题讨论】:

    标签: iphone xcode uiview uibutton uiswitch


    【解决方案1】:

    想想你的方法:

    - (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
        }
    }
    

    【讨论】:

    • 感谢纠正,你介意告诉我如何将发件人信息传递给 onOrOff 方法吗?
    • 啊,我明白了,我也可以声明一个 uibutton 变量来存储发件人本身吗?因为当我有 20 个按钮时,使用 20 个 if 语句会很乏味
    【解决方案2】:

    这样做的一种方法是,在 IB 中给他们不同的标签号,并在 - (IBAction)lightBulbPressed:(UIButton *)sender 方法中,获取他们的标签。例如NSInteger pressedButtonTag = [sender tag];,然后从那里开始。

    另外,每次用户按下按钮时,您都可以在 IB 中添加该视图,添加开关,而不是 alloc/init myView在.h中。在需要时调用它,然后再次通过标签访问开关,例如(UISwitch *mySwitch = (UISwitch *)[myView viewWithTag:kSwitchTag];)并做任何你想做的事(打开或关闭),将其添加到子视图并稍后将其删除。这样更有效率。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-07-02
      • 2022-12-05
      • 1970-01-01
      • 2012-02-08
      • 1970-01-01
      • 2016-01-12
      • 2016-12-31
      • 2020-11-14
      相关资源
      最近更新 更多