2010-01-16 160 views
0

我正在開發一個應用程序,它同時使用視頻錄製和照片shoting.So我想顯示按鈕爲此操作系統我執行這些methods.It工作正常,當我爲OS 3.1,但是當我建立OS 3.0也顯示錯誤imagepicker控制器爲iPhone模擬器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

問題是3.1中添加了視頻捕獲,這意味着3.0的圖像拾取器不支持任何視頻屬性和方法(請參閱the documentation並注意可用性部分)。

至於解決,我想你可以嘗試使用,而不是點語法的消息語法:

[picker setShowsCameraControls:YES]; 

這會給你一個警告,但(編譯爲3.0及以上時),你必須注意不要在較舊的設備上執行此操作,因爲您會遇到未知的選擇器異常。或者你也可以動態調用的選擇,這將擺脫的警告,你也可以檢查是否選擇首先支持:

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

已經有severalquestions關於編寫不同的操作系統版本。


回覆評論:我認爲主要的問題是,你是盲目地將代碼粘貼不understading它。不要這樣做。坐下來思考代碼的作用,直到你理解每一行。現在更徹底地解釋你的問題:

3.0中的圖像選擇器沒有視頻控件,因爲它無法錄製視頻。因此,當您嘗試編譯代碼(如picker.showsCameraControls)時,編譯器會抱怨:Image Picker類中沒有showsCameraControls屬性,該屬性僅在3.1中添加。

但是有一種解決方法,您可以使用消息語法([foo setBar:…])而不是點語法(foo.bar=…)。如果foo對象沒有setBar方法,編譯器會發出警告,但代碼將被編譯。現在讓我們使用的消息語法來設置相機的控制:

[picker setShowsCameraControls:YES]; 

當你編譯3.1的代碼,它會編譯沒有警告和運行沒有錯誤。當你爲3.0編譯時,你會從編譯器得到一個警告,如果你運行代碼,它會失敗(因爲沒有showsCameraControls屬性)。但是,這並不是一個問題,因爲你只能決定如果操作系統支持它運行的脆弱代碼:

這是可行的,但你仍然會得到3.0編譯器警告。現在取決於您的默認構建目標。如果你爲3.1構建,那麼警告就會消失,代碼應該可以在3.0上正常工作。

+0

你能完成代碼嗎?我的意思是根據你的要求改變我的代碼.... – 2010-01-16 08:55:44

+0

不,因爲我真的認爲現在你最好自己弄明白。至少在你再次遇到真正的問題之前。 – zoul 2010-01-16 08:58:35

+0

但它不工作。在這裏我試了 [imagePickerController setAllowsImageEditing:YES]; \t \t \t SEL msg = @selector(setVideoQuality :); \t \t \t如果([imagePickerController respondsToSelector:MSG]) \t \t \t \t [imagePickerController performSelector:MSG withObject:自afterDelay:0]; 但它仍然顯示錯誤 – 2010-01-16 09:08:45