惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

S
Security Affairs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
Netflix TechBlog - Medium
云风的 BLOG
云风的 BLOG
M
MIT News - Artificial intelligence
A
About on SuperTechFans
Last Week in AI
Last Week in AI
博客园 - 叶小钗
博客园 - Franky
腾讯CDC
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
The GitHub Blog
The GitHub Blog
Google DeepMind News
Google DeepMind News
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
小众软件
小众软件
The Hacker News
The Hacker News
C
Cisco Blogs
C
CXSECURITY Database RSS Feed - CXSecurity.com
L
LangChain Blog
WordPress大学
WordPress大学
美团技术团队
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
AWS News Blog
AWS News Blog
S
Securelist
T
Tenable Blog
I
Intezer
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LINUX DO - 热门话题
博客园 - 三生石上(FineUI控件)
Y
Y Combinator Blog
Cisco Talos Blog
Cisco Talos Blog
T
Tor Project blog
Security Latest
Security Latest
Apple Machine Learning Research
Apple Machine Learning Research
C
Cybersecurity and Infrastructure Security Agency CISA
S
Schneier on Security
L
Lohrmann on Cybersecurity
P
Privacy & Cybersecurity Law Blog
月光博客
月光博客
P
Proofpoint News Feed
Vercel News
Vercel News
Simon Willison's Weblog
Simon Willison's Weblog
G
GRAHAM CLULEY
T
The Blog of Author Tim Ferriss
F
Fortinet All Blogs
博客园 - 【当耐特】
A
Arctic Wolf
aimingoo的专栏
aimingoo的专栏

博客园 - Bruce Lee

Android的界面设计规范-7 Android的界面设计规范-6 Android的界面设计规范-5 Android的界面设计规范-4 Android的界面设计规范-3 Android的界面设计规范-2 Android的界面设计规范-1 Monotouch 移动位于键盘下的内容,自动滚动被键盘遮住的内容 RESTful Web Services,客户端Silverlight提交POST数据报错 Monotouch Copy item from album(从相册拷贝文件出来) Monotouch Save Image To Application(保存相册图片到你的应用程序) Monotouch中使用UINavigationController Monotouch 项目选择Storyborads还是XIBs Montouch 定义一个定制的 View Control类 Monotouch 视图管理周期 Montouch多视图的创建与销毁 Monotouch 常用例子代码 Montouch 增加图片到模拟器(Simulator)的相册中 Monotouch Table View 里面动态增加Table View Cell Switch 触发Switch事件 程序崩溃
Monotouch在IPAD与IPhone使用UIImagePickerController的图片选择不同的代码
Bruce Lee · 2012-09-28 · via 博客园 - Bruce Lee

UIImagePickerController虽然可以用在IPAD与IPhone,但代码有所不同。

IPhone的代码如下:

   1:  partial void SelectImage(NSObject sender, MonoTouch.UIKit.UIEvent @event) {
   2:              UIImagePickerController picker = new UIImagePickerController ();
   3:              picker.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
   4:              picker.Delegate = new MyImagePickerDelegate (this);
   5:              this.PresentModalViewController (picker,true);
   6:          }
   7:   
   8:  public class MyImagePickerDelegate : UIImagePickerControllerDelegate
   9:      {
  10:          MYTableViewController _mvc;
  11:          public MyImagePickerDelegate (MYTableViewController mvc)
  12:          {
  13:              _mvc = mvc;
  14:          }
  15:          public override void FinishedPickingImage(UIImagePickerController picker, UIImage image, NSDictionary editingInfo) {
  16:              // TODO: Implement - see: http://go-mono.com/docs/index.aspx?link=T%3aMonoTouch.Foundation.ModelAttribute
  17:          }
  18:   
  19:          public override void Canceled(UIImagePickerController picker) {
  20:              // TODO: Implement - see: http://go-mono.com/docs/index.aspx?link=T%3aMonoTouch.Foundation.ModelAttribute
  21:          }
  22:      }

这段代码在IPhone下是正常的,但在IPAD上会报如下异常

MonoTouch.Foundation.MonoTouchException: Objective-C exception thrown. Name: NSInvalidArgumentException Reason: On iPad, UIImagePickerController must be presented via UIPopoverController

为什么呢?就和异常提的一样。UIImagePickerController必须由UIPopoverController来承载。

IPAD代码:

   1:  //static UIImagePickerController imagePicker = new UIImagePickerController();
   2:  //static UIPopoverController popOver = new UIPopoverController (imagePicker);

UIImagePickerController imagePicker;

UIPopoverController popOver;

   3:  partial void SelectImage(NSObject sender, MonoTouch.UIKit.UIEvent @event) {
   4:              //UIImagePickerController picker = new UIImagePickerController ();
   5:              //picker.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
   6:              //picker.Delegate = new MyImagePickerDelegate (this);
   7:              //this.PresentModalViewController (picker,true);
   8:   
   9:              if (popOver == null || popOver.ContentViewController == null)
  10:              {
  11:                  imagePicker = new UIImagePickerController();
  12:                  popOver = new UIPopoverController(imagePicker);
  13:                  ImagePickerDelegate imgDel = new ImagePickerDelegate();
  14:                  imagePicker.Delegate = imgDel;
  15:                  imagePicker.SourceType = UIImagePickerControllerSourceType.PhotoLibrary;
  16:              }
  17:              if (popOver.PopoverVisible)
  18:              {
  19:                  popOver.Dismiss(true);
  20:                  imagePicker.Dispose();
  21:                  popOver.Dispose();
  22:                  return;
  23:              }
  24:              else
  25:              {
  26:                  popOver.PresentFromRect(((UIButton)sender).Frame, this.View, UIPopoverArrowDirection.Any, true);
  27:              }
  28:   
  29:          }

public override void ViewDidLoad()

        {

            imagePicker = new UIImagePickerController();

            popOver = new UIPopoverController(imagePicker);

            base.ViewDidLoad();

        }


注意把2个Control设置成静态的,否则会报错[UIPopoverController dealloc] reached while popover is still visible.

也可以不设置成静态变量,但要声明为类成员变量或属性,然后再ViewDidLoad方法初始化,就是避免在要使用的时候已经被GC回收了。

原因还是GC,所以一个很好的做法是UIPopoverControllers应始终保持在一个实例变量。或建立一个强类型属性。

   1:  public class ImagePickerDelegate : UIImagePickerControllerDelegate
   2:      {
   3:          public ImagePickerDelegate()
   4:          {}
   5:          
   6:          public override void FinishedPickingMedia(UIImagePickerController picker, NSDictionary info)
   7:          {
   8:              UIImage image = (UIImage)info.ObjectForKey(new NSString("UIImagePickerControllerOriginalImage"));
   9:              // do whatever else you'd like to with the image
  10:          }
  11:      }

总结:

  1. UIImagePickerController必须由UIPopoverController来承载。
  2. 如果presentModalViewController的UIImagePickerController的SourceType为设置到“UIImagePickerControllerSourceTypeCamera”时。设备必须是iPad 2的相机在全屏幕视图。最大化才是是正确的UIModalPresentationStyle.FullScreen,presentModalViewController的sourceType被设置成任何其他的情况都会崩溃。UIImagePickerController Class Reference
  3. UIPopoverControllers应始终保持在一个实例变量。或建立一个强类型属性保存。

作者:Bruce Lee
出处:http://www.cnblogs.com/BruceLee521
本博原创文章版权归博客园和本人共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出作者名称和原文连接,否则保留追究法律责任的权利。

实际效果