Objective-C:为什么我的if语句不起作用?

时间:2013-06-30 11:16:38

标签: objective-c uiswitch

这里我有一些代码可以检查iphone是否有相机闪光灯。然后使用以下代码检查我的开关是否打开:

 if(switch1.on){

                }

在没有此代码的情况下,指示灯会亮起,我也尝试过这段代码:

if(!(switch1.on)){

                  }

成功打开相机闪光灯,但即使开关设定为关闭也会打开相机

这是我的完整代码:

-(IBAction)torchon:(id)sender{
    AVCaptureDevice *flashlight = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    if ([flashlight isTorchAvailable] & [flashlight isTorchModeSupported:AVCaptureTorchModeOn]) {

        BOOL success = [flashlight lockForConfiguration:Nil];
        if(success){
            if(switch1.on){ //// or (!(switch1.on))

                on.hidden = YES;
                [UIScreen mainScreen].brightness = 1.0;
                [flashlight setTorchMode:AVCaptureTorchModeOn];
                [flashlight unlockForConfiguration];
            }
       }
    }    
}

任何帮助将不胜感激

**EDIT:**

这是代码,当交换机的值发生变化时,我使用ibactions将交换机设置为no。此代码成功运行:

-(IBAction)switch1{
    if (switch1.on) {
        switch1.on = YES;
        switch2.on = NO;
    } else{
        switch2.on = YES;
        switch1.on  = NO;
    }    
}

-(IBAction)switch2{
    if (switch2.on) {
        switch2.on = YES;
        switch1.on  = NO;
    } else{
        switch1.on = YES;
        switch2.on = NO;
    }
}

答案

首先添加一个bool:

bool yes;

然后在viewdidload

中设置该bool
- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    yes = YES;
}

之后在调用ibaction时将其设置为YES,并在关闭开关后将其设置为NO:

-(IBAction)switch1{
    if (swich1.on) {
    swich1.on = YES;
    swich2.on = NO;
        yes = YES;
    }

}


-(IBAction)switch2{
    if (swich2.on) {

    swich2.on = YES;
    swich1.on  = NO;
        yes = NO;
    }

}

最后在检查if(switch1.on){}时,你需要将其更改为if(yes==YES){},以便if语句如下所示:

-(IBAction)torchon:(id)sender{
    AVCaptureDevice *flashlight = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    if ([flashlight isTorchAvailable] & [flashlight isTorchModeSupported:AVCaptureTorchModeOn]) {

        BOOL success = [flashlight lockForConfiguration:Nil];
        if(success){
            if(yes==YES){
                on.hidden = YES;
                [UIScreen mainScreen].brightness = 1.0;
                [flashlight setTorchMode:AVCaptureTorchModeOn];
                [flashlight unlockForConfiguration];

            }
        }

    }

}

2 个答案:

答案 0 :(得分:0)

UISwitchon属性的另一个getter。

@property(nonatomic, getter=isOn) BOOL on;

最好使用.isOn代替.on来获取值。

此外,您的一些代码可以简化:

-(IBAction)switch1{
    [switch2 setOn:!switch1.isOn];    
}

-(IBAction)switch2{
    [switch1 setOn:!switch2.isOn];
}

如果在方法中使用sender动作,情况会更好。

答案 1 :(得分:0)

您的IBAction方法似乎与交换机的getter类似。这可能会导致不希望的副作用。将您的方法重构为单个方法,更符合良好的编程习惯:

-(IBAction)switchDidChange:(UISwitch*)aSwitch {
   UISwitch* otherSwitch = (aSwitch == switch1)? switch2 : switch1;
   [otherSwitch setOn:!aSwitch.on animated:YES];
}

此外,在您的代码中,on属性似乎并不会影响打开或关闭的内容。包括这个条件。