imagepicker控制器在为iphone模拟器3.0构建时显示错误

时间:2010-01-16 07:48:24

标签: objective-c xcode iphone-sdk-3.0 uiimagepickercontroller

我正在开发一个同时使用视频录制和照片拍摄的应用程序。所以我想根据操作系统显示按钮,我实现了这些方法。当我为OS 3.1构建但是当我为OS 3.0构建时,它工作正常显示错误

这是方法

    if ([self videoRecordingAvailable])
    {
        imagePickerController.sourceType =  UIImagePickerControllerSourceTypeCamera;
        imagePickerController.allowsImageEditing = YES;
        imagePickerController.allowsEditing = YES;
        imagePickerController.videoQuality = UIImagePickerControllerQualityTypeHigh;
        imagePickerController.videoMaximumDuration = 60.0f; // Length for video recording in seconds
        imagePickerController.mediaTypes = [NSArray arrayWithObjects:@"public.movie", nil];
        imagePickerController.showsCameraControls=YES;      
        [self.navigationController presentModalViewController:imagePickerController animated:YES];          
    }


- (BOOL) videoRecordingAvailable
{
if (![UIImagePickerController isSourceTypeAvailable:UIImagePickerControllerSourceTypeCamera]) return NO;
return [[UIImagePickerController availableMediaTypesForSourceType:UIImagePickerControllerSourceTypeCamera] containsObject:@"public.movie"];
}

错误是

error: request for member 'allowsEditing' in something not a structure or union
error: request for member 'videoQuality' in something not a structure or union
error: 'UIImagePickerControllerQualityTypeHigh' undeclared (first use in this function)
 (Each undeclared identifier is reported only once for each function it appears in.)
error: request for member 'videoMaximumDuration' in something not a structure or union
error: request for member 'showsCameraControls' in something not a structure or union

我该如何解决这个问题?

1 个答案:

答案 0 :(得分:1)

问题是3.1中添加了视频捕获,这意味着3.0中的图像选择器不支持任何视频属性和方法(请参阅the documentation并注意可用性部分)。

至于解决方案,我想您可以尝试使用消息语法而不是点语法:

[picker setShowsCameraControls:YES];

这会给你警告(当编译为3.0及更早版本时),你必须小心不要在旧设备上这样做,因为你会得到一个未知的选择器异常。或者您可以动态调用选择器,这将消除警告,您还可以检查选择器是否首先受支持:

SEL msg = @selector(setShowsCameraControls:);
if ([picker respondsToSelector:msg])
    [picker performSelector…];

关于不同操作系统版本的编写,已经有several questions


回应评论:我认为主要的问题是你盲目地粘贴代码而没有强调它。不要那样做。坐下来思考代码的作用,直到你理解每一行。现在更彻底地解释你的问题:

3.0中的Image Picker没有视频控件,因为它无法录制视频。因此,当您尝试编译picker.showsCameraControls之类的代码时,编译器会抱怨:Image Picker类中没有showsCameraControls属性,只在3.1中添加了该属性。

但是有一种解决方法,您可以使用消息语法([foo setBar:…])而不是点语法(foo.bar=…)。如果foo对象没有setBar方法,编译器会发出警告,但代码将编译。现在让我们使用消息语法来设置相机控件:

[picker setShowsCameraControls:YES];

为3.1编译此代码时,它将在没有警告的情况下编译并运行且没有错误。当您编译3.0时,您将收到编译器的警告,如果您运行代码,它将失败(因为实际上没有showsCameraControls属性)。但这不是问题,因为如果操作系统支持它,你只能决定运行脆弱的代码:

BOOL videoSupported = [picker respondsToSelector:@selector(setShowsCameraControls:)];
if (videoSupported) {
    [picker setShowsCameraControls:YES];
    // set all the other video properties
} else {
    // do what makes sense without video support
}

这样可行,但您仍会在3.0上收到编译器警告。现在它取决于您的默认构建目标。如果你为3.1构建,警告将消失,代码应该在3.0上正常工作。