У меня есть приложение на основе Xamarin.Forms, которое работает на Android и iOS. Прямо сейчас я реализую функцию выбора изображений с камеры и загрузки их на наш сервер. Поэтому я пишу специфичный для платформы код для iOS, где и происходит ошибка.
Я вызываю UIImagePickerController из специфичного для платформы средства визуализации для iOS. Открывается нормально. Но при нажатии на изображение в UIImagePickerController ничего не происходит, кроме Visual Studio, показывающего сообщение в консоли отладки:
"Предупреждение. Попытка представить Xamarin_Forms_Platform_iOS_ModalWrapper: 0x155a7ed00 в Xamarin_Forms_Platform_iOS_PlatformRenderer: 0x153ead6a0, представление которого отсутствует в иерархии окон!" * 1007
Я гуглил и обнаружил, что кто-то пишет функцию GetVisibleViewController, которую я адаптировал к своему проекту (вы можете увидеть это ниже). На ViewController, который возвращает эта функция, я вызываю метод PresentModalViewController (). К сожалению, это тоже не работает. Невозможно выбрать фотографию.
private void ChoosePhoto()
{
_imagePicker = new UIImagePickerController()
{
SourceType = UIImagePickerControllerSourceType.PhotoLibrary,
MediaTypes = new string[] { UTType.Image }
};
_imagePicker.FinishedPickingMedia += delegate (object sender, UIImagePickerMediaPickedEventArgs e)
{
var fileName = eopAppLibrary.Tools.GetTimestampJpegFileName("ScanToEop_iOS");
var jpegImageData = e.OriginalImage.AsJPEG();
var jpegBytes = jpegImageData.ToArray();
Events.RaiseFilePreviewNeeded(this, jpegBytes, fileName);
};
_imagePicker.Canceled += delegate (object sender, EventArgs e)
{
_imagePicker.DismissModalViewController(true);
};
var viewController = GetVisibleViewController();
viewController.PresentModalViewController(_imagePicker, true);
}
UIViewController GetVisibleViewController(UIViewController controller = null)
{
controller = controller ?? UIApplication.SharedApplication.KeyWindow.RootViewController;
if (controller.PresentedViewController == null)
{
return controller;
}
if (controller.PresentedViewController is UINavigationController)
{
return ((UINavigationController)controller.PresentedViewController).VisibleViewController;
}
if (controller.PresentedViewController is UITabBarController)
{
return ((UITabBarController)controller.PresentedViewController).SelectedViewController;
}
return GetVisibleViewController(controller.PresentedViewController);
}