On iPad, UIImagePickerController must be presented via UIPopoverController

On iPad, UIImagePickerController must be presented via UIPopoverController 可以用以下方法来判断设备的类型选择不同的Controller
if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPhone) { // We are using an iPhone UIActionSheet *alertSheet = [[UIActionSheet alloc] initWithTitle:@"Where do you want to get your daily image?" delegate:(self) cancelButtonTitle:@"Cancel" destructiveButtonTitle:nil otherButtonTitles:@"Camera", @"Library", nil]; [alertSheet setTag:0]; [alertSheet setDelegate:self]; [alertSheet showFromTabBar:[[self tabBarController] tabBar]]; [alertSheet release]; }else { // We are using an iPad UIImagePickerController *imagePickerController = [[UIImagePickerController alloc] init]; imagePickerController.delegate = self; UIPopoverController *popoverController=[[UIPopoverController alloc] initWithContentViewController:imagePickerController]; popoverController.delegate=self; [popoverController presentPopoverFromRect:((UIButton *)sender).bounds inView:sender permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES]; }
 

iPadiPhone调用UIImagePickerViewController方法略有不同是本文要介绍的内容,文中很详细的讲述了iPadiphone各自的调用方法,来看详细内容。

我们知道,在iPhone中获取照片库常用的方法如下:

   
   
   
   
  1. UIImagePickerController *m_imagePicker = [[UIImagePickerController alloc] init];  
  2.     if ([UIImagePickerController isSourceTypeAvailable:  
  3.          UIImagePickerControllerSourceTypePhotoLibrary]) {  
  4.         m_imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
  5.         m_imagePicker.delegate = self;  
  6.         //        [m_imagePicker.navigationBar.subviews];  
  7.         [m_imagePicker setAllowsEditing:NO];  
  8.         //m_imagePicker.allowsImageEditing = NO;  
  9.         [self presentModalViewController:m_imagePicker animated:YES];  
  10.         [m_imagePicker release];  
  11.     }else {  
  12.         UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:  
  13. @"Error accessing photo library!" delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];  
  14.         [alert show];  
  15.         [alert release];  
  16.     } 

这对iPhone的操作是没有问题的。但是当我们在iPad环境中却有问题了,当我们运行时会报如下错误:

   
   
   
   
  1. Terminating app due to uncaught exception 'NSInvalidArgumentException',   
  2. reason: 'On iPad, UIImagePickerController must be presented via UIPopoverController' 

所以我们必须通过UIPopoverController来实现才行。具体实现如下:

   
   
   
   
  1. UIImagePickerController *m_imagePicker = [[UIImagePickerController alloc] init];  
  2.     if ([UIImagePickerController isSourceTypeAvailable:  
  3.          UIImagePickerControllerSourceTypePhotoLibrary]) {  
  4.         m_imagePicker.sourceType = UIImagePickerControllerSourceTypePhotoLibrary;  
  5.         m_imagePicker.delegate = self;  
  6.         [m_imagePicker setAllowsEditing:NO];  
  7.         UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController:m_imagePicker];  
  8.         self.popoverController = popover;  
  9.         //popoverController.delegate = self;  
  10.            
  11.         [popoverController presentPopoverFromRect:CGRectMake(0, 0, 300, 300) inView:self.
  12. view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];  
  13.            
  14.         //[self presentModalViewController:m_imagePicker animated:YES];  
  15.         [popover release];  
  16.         [m_imagePicker release];  
  17.     }else {  
  18.         UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:@"Error accessing photo library!" 
  19. delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];  
  20.         [alert show];  
  21.         [alert release];  
  22.     } 

这里需要注意,对局部UIPopoverController对象popover我们赋给了一个全局的UIPopoverController对象popoverController。而不能直接调用popover。因为在popover对象还可见时,是不能够被释放的。

小结:iPadiphone调用UIImagePickerViewController方法略有不同的内容介绍完了,希望本文对你有所帮助!


你可能感兴趣的:(ios,ios,ios,iPhone,iPhone,iPhone,iPhone,iPhone,ipad,ipad,ipad,ipad)