我正在开发一个同时使用视频录制和照片拍摄的应用程序。所以我想根据操作系统显示按钮,我实现了这些方法。当我为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
我该如何解决这个问题?
答案 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上正常工作。