Что я хочу сделать, это создать всплывающее окно с UIImagePickerController. Это легко, но я хочу создать служебный метод, который генерирует всплывающее окно UIImagePickerController и возвращает UIImage, как только пользователь выберет его. Проблема заключается в том, что UIImagePickerController имеет свойство делегата, которое используется для асинхронного завершения. Я думал, что, возможно, я мог бы передать делегата в свою служебную функцию, которая содержит код для выполнения после выбора изображения, но код для выполнения должен работать с выбранным изображением. Это код, который у меня есть до сих пор, и просто, чтобы все знали, он падает. Я верю, что это потому, что я выполняю это статическим методом.
namespace GalleryProto
{
static public class CameraUtility
{
public static void GetImageFromGalleryWithPopup(UIViewController parentViewController, PointF centerPoint)
{
UIImagePickerController imagePicker;
UIPopoverController popOver;
imagePicker = new UIImagePickerController ();
popOver = new UIPopoverController (imagePicker);
popOver.DidDismiss += (popOverController, e) =>
{
if (popOver != null && popOver.PopoverVisible) {
Console.WriteLine ("Popover Dismissed.");
popOver.Dismiss (true);
imagePicker.Dispose ();
popOver.Dispose ();
imagePicker = null;
popOver = null;
}
};
Console.WriteLine ("Before Finished Picking Image Delegate.");
imagePicker.Delegate = new MyPickerDelegate (imagePicker, popOver);
imagePicker.SourceType = UIImagePickerControllerSourceType.PhotoLibrary;
imagePicker.AllowsEditing = false;
imagePicker.MediaTypes = new string[] {"public.image"};
RectangleF popRectangle = new RectangleF (centerPoint, new SizeF (1, 1));
popOver.PresentFromRect (popRectangle, parentViewController.View, 0, true); //Center the popup on the Image Content View.
}
public class MyPickerDelegate : UIImagePickerControllerDelegate
{
UIImagePickerController _imagePicker;
UIPopoverController _popOver;
public MyPickerDelegate(UIImagePickerController imagePicker, UIPopoverController popOver)
{
_imagePicker = imagePicker;
_popOver = popOver;
}
public override void Canceled (UIImagePickerController picker)
{
Console.WriteLine("Canceleled");
}
public override void FinishedPickingImage (UIImagePickerController picker, UIImage image, NSDictionary editingInfo)
{
Console.WriteLine("Finished Picking Image");
_popOver.Dismiss (true);
_imagePicker.Dispose ();
_popOver.Dispose ();
_imagePicker = null;
_popOver = null;
}
}
}
}