本文转载至:http://blog.csdn.net/k12104/article/details/8537695

On iPad, UIImagePickerController must be presented via UIPopoverController  可以用以下方法来判断设备的类型选择不同的Controller
if(UI_USER_INTERFACE_IDIOM()==UIUserInterfaceIdiomPhone){// We are using an iPhoneUIActionSheet*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 iPadUIImagePickerController*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];}

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

我们知道,在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. [popoverController presentPopoverFromRect:CGRectMake(0, 0, 300, 300) inView:self.
  11. view permittedArrowDirections:UIPopoverArrowDirectionAny animated:YES];
  12. //[self presentModalViewController:m_imagePicker animated:YES];
  13. [popover release];
  14. [m_imagePicker release];
  15. }else {
  16. UIAlertView *alert = [[UIAlertView alloc]initWithTitle:nil message:@"Error accessing photo library!"
  17. delegate:nil cancelButtonTitle:@"Close" otherButtonTitles:nil];
  18. [alert show];
  19. [alert release];
  20. }

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

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

On iPad, UIImagePickerController must be presented via UIPopoverController的更多相关文章

  1. iOS:iPad和iPhone开发的异同(UIPopoverController、UISplitViewController)

    iPad和iPhone开发的异同 1.iPhone和iPad: niPhone是手机,iPad.iPad Mini是平板电脑 iPhone和iPad开发的区别 屏幕的尺寸 \分辨率 UI元素的排布 \ ...

  2. IOS成长之路-调用照相机和相册功能

    打开相机: //先设定sourceType为相机,然后判断相机是否可用(ipod)没相机,不可用将sourceType设定为相片库 UIImagePickerControllerSourceType ...

  3. iPad 控件 UIPopoverPresentationController 使用 iPhone可用

    UIPopoverController 在iOS9之后被废弃了,,, iOS8 新控件UIPopoverPresentationController可运用在iphone和iPad上,使用基本同 UIP ...

  4. BlocksKit的使用

    一.引言 众所周知Block已被广泛用于iOS编程.它们通常被用作可并发执行的逻辑单元的封装,或者作为事件触发的回调.Block比传统回调函数有2点优势: 允许在调用点上下文书写执行逻辑,不用分离函数 ...

  5. IOS 在Ipad 横屏 上使用UIImagePickerController

    转载前请注明来源:http://www.cnblogs.com/niit-soft-518/p/4381328.html 最近在写一个ipad的项目,该项目必须是横屏.进入正题,有一项功能是要调用系统 ...

  6. iPad 控件UIPopoverController使用

    UIPopoverController 是iPad特有控件,(iOS7-9),在iOS9之后别废弃 使用步骤 设置内容控制器 UIPopoverController直接继承NSObject,不具备可视 ...

  7. iOS iPad开发之UIPopoverController的使用

    1. 什么是UIPopoverController? 是iPad开发中常见的一种控制器(在iphone上不允许使用) 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewCon ...

  8. iOS8 iPad Warning: Attempt to present <UIImagePickerController:xxxx > on xxxx which is already presenting (null)

    解决方法: /* I think this is because in iOS 8, alert views and action sheets are actually presented view ...

  9. iPad开发中UIPopoverController的使用

    什么是UIPopoverController 是iPad开发中常见的一种控制器 跟其他控制器不一样的是,它直接继承自NSObject,并非继承自UIViewController 它只占用部分屏幕空间来 ...

随机推荐

  1. 一款基于jquery超炫的图片切换特效

    今天为给大家介绍一款基于jquery超炫的图片切换特效.由百叶窗飞入显示图片.图片消息的时候也是百叶窗渐行渐远.用于图片展示,效果还是非常好,我们一起看下效果图: 在线预览   源码下载 来看下实现的 ...

  2. c#简单写售票系统

    原理: 先生成一个9行4列的数组,然后用一个输入的值(坐标)去替换掉座位 代码: using System; using System.Collections.Generic; using Syste ...

  3. loadrunner11 测试restful

    loadrunner不知道为啥会有这么大的体积. 一开始用的是c脚本,可是恶心的是又不是完全的c,读文件的fseek居然没有. 后来又折腾java脚本,发现loadrunner11 java要用jdk ...

  4. 【ExtJS】各种获取元素组件方法

    1.get().getDom().getCmp().getBody().getDoc(): get(id/obj): get方法用来得到一个Ext元素,也就是类型为Ext.Element的对象, Ex ...

  5. 查看局域网其它电脑的计算机名和IP

    一.下面脚本可查看局域网中的电脑计算机名和IP,保存下面文本至记事本.后缀改成bat COLOR 0A CLS @ECHO Off Title 查询局域网内在线电脑IP :send @ECHO off ...

  6. [mmc]Linux下MMC/SD/SDIO的识别与操作

    转自:http://blog.csdn.net/skdkjzz/article/details/38927943 我们知道host在扫描卡的过程中,其识别的顺序为SDIO  SD MMC,并且从它的注 ...

  7. 浅谈WebService的调用<转>

    0.前言 前段时间,公司和电信有个合作,产品对接电信的某个平台,使用了WebService接口的调用,实现了业务受理以及单点登录.终于使用到了WebService,楼主还是比较兴奋的,目前功能已经上线 ...

  8. MySQL死锁原因分析

    行级锁有三种模式: innodb 行级锁 record-level lock大致有三种:record lock, gap lock and Next-KeyLocks. record lock  锁住 ...

  9. 二叉树的java实现

    一.分析 一个二叉树节点有三个部分,一个是指向左子树的部分,一个是指向右子树的部分,另外一个是数据部分.可以把这个节点抽象成一个节点对象,给对象有两个节点对象属性和一个数据属性.如下图: 一个二叉树有 ...

  10. 【转】使用 Jmeter 做 Web 接口测试

    最近总结了一下在接口测试方面的知识与心得,在这里与大家分享一下,如有说的不对的地方请多多指正. 接口测试概述 定义 API testing is a type of software testing ...