Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/104.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 观察到的键值不允许枚举上的Switch语句_Ios_Objective C_Enums_Key Value Observing - Fatal编程技术网

Ios 观察到的键值不允许枚举上的Switch语句

Ios 观察到的键值不允许枚举上的Switch语句,ios,objective-c,enums,key-value-observing,Ios,Objective C,Enums,Key Value Observing,我试图使用键值观察来检测AVCaptureDevice的torchMode变量的变化。我遇到了一个问题,switch语句无法识别该值(它是一个枚举)。知道怎么回事吗?我知道程序通过开关到达线路,然后立即跳过所有情况。以下是相关代码: - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context { i

我试图使用键值观察来检测AVCaptureDevice的torchMode变量的变化。我遇到了一个问题,switch语句无法识别该值(它是一个枚举)。知道怎么回事吗?我知道程序通过开关到达线路,然后立即跳过所有情况。以下是相关代码:

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{

    if (context == CapturingStillImageContext)
    {
        BOOL isCapturingStillImage = [change[NSKeyValueChangeNewKey] boolValue];

        if (isCapturingStillImage)
        {
            [self runStillImageCaptureAnimation];
        }
    }
    else if (context == RecordingContext)
    {
        BOOL isRecording = [change[NSKeyValueChangeNewKey] boolValue];

        dispatch_async(dispatch_get_main_queue(), ^{
            if (isRecording)
            {
                [[self record] setTitle:NSLocalizedString(@"-", @"Recording button stop title") forState:UIControlStateNormal];
                [[self record] setEnabled:YES];
            }
            else
            {
                [[self record] setTitle:NSLocalizedString(@"+", @"Recording button record title") forState:UIControlStateNormal];
                [[self record] setEnabled:YES];
            }
        });
    }
    else if (context == SessionRunningAndDeviceAuthorizedContext)
    {
        BOOL isRunning = [change[NSKeyValueChangeNewKey] boolValue];

        dispatch_async(dispatch_get_main_queue(), ^{
            if (isRunning)
                [[self record] setEnabled:YES];
            else
                [[self record] setEnabled:NO];
        });
    }
    else if (context == TorchContext) {
        id torchValue = [change objectForKey: NSKeyValueChangeNewKey];
        NSString* title;
        switch((AVCaptureTorchMode)torchValue) {
        case AVCaptureTorchModeAuto: title = @"Auto"; break;
        case AVCaptureTorchModeOff: title = @"Off"; break;
        case AVCaptureTorchModeOn: title = @"On"; break;
        }
        dispatch_async(dispatch_get_main_queue(), ^{
            [self.torch setTitle:title forState:UIControlStateNormal];
            //NSLog(self.torch);
        });
    }
    else
    {
        [super observeValueForKeyPath:keyPath ofObject:object change:change context:context];
    }
}
为键值添加观察者的代码:

- (void)viewWillAppear:(BOOL)animated
{
    [self.navigationController setNavigationBarHidden:YES animated:NO];
    dispatch_async([self sessionQueue], ^{
        [self addObserver:self forKeyPath:@"sessionRunningAndDeviceAuthorized" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:SessionRunningAndDeviceAuthorizedContext];
        [self addObserver:self forKeyPath:@"stillImageOutput.capturingStillImage" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:CapturingStillImageContext];
        [self addObserver:self forKeyPath:@"movieFileOutput.recording" options:(NSKeyValueObservingOptionOld | NSKeyValueObservingOptionNew) context:RecordingContext];
        [self addObserver:self forKeyPath:@"videoDeviceInput.device.torchMode" options:(NSKeyValueObservingOptionNew) context:TorchContext];
    ...
}

我解决了这个问题。我不确定这是否是最优雅的解决方案,但我只是将该值转换为一个NSNumber,得到整数值,然后将其放入开关中。代码如下:

int torchValue = ((NSNumber*)[change objectForKey: NSKeyValueChangeNewKey]).integerValue;
        NSString* title;
        switch(torchValue) {
            case AVCaptureTorchModeAuto: title = @"Auto"; break;
            case AVCaptureTorchModeOff: title = @"Off"; break;
            case AVCaptureTorchModeOn: title = @"On"; break;
        }

您在switch语句中使用的是对象,而不是枚举。不能将对象强制转换为枚举。请显示添加观察者和传递上下文的代码。