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

推荐订阅源

freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
雷峰网
雷峰网
博客园 - 叶小钗
C
Check Point Blog
F
Fortinet All Blogs
A
About on SuperTechFans
Y
Y Combinator Blog
Vercel News
Vercel News
IT之家
IT之家
V
V2EX
T
Tailwind CSS Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
Blog — PlanetScale
Blog — PlanetScale
罗磊的独立博客
云风的 BLOG
云风的 BLOG
U
Unit 42
博客园_首页
量子位
M
MIT News - Artificial intelligence
G
Google Developers Blog
小众软件
小众软件
N
Netflix TechBlog - Medium
P
Palo Alto Networks Blog
S
Schneier on Security
T
Tor Project blog
F
Full Disclosure
C
Cyber Attacks, Cyber Crime and Cyber Security
T
Tenable Blog
T
The Blog of Author Tim Ferriss
Spread Privacy
Spread Privacy
Engineering at Meta
Engineering at Meta
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Google DeepMind News
Google DeepMind News
T
Threat Research - Cisco Blogs
Know Your Adversary
Know Your Adversary
P
Proofpoint News Feed
Security Latest
Security Latest
D
Darknet – Hacking Tools, Hacker News & Cyber Security
博客园 - 司徒正美
AWS News Blog
AWS News Blog
Simon Willison's Weblog
Simon Willison's Weblog
Recorded Future
Recorded Future
L
Lohrmann on Cybersecurity
I
Intezer
L
LangChain Blog
L
LINUX DO - 热门话题

博客园 - 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
本博原创文章版权归博客园和本人共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出作者名称和原文连接,否则保留追究法律责任的权利。

实际效果