c# - UIImagePickerController 出现“尝试呈现其视图不在窗口层次结构中的 Xamarin_Forms_Platform_iOS_ModalWrapper”错误
问题描述
我有一个在 Android 和 iOS 上运行的基于 Xamarin.Forms 的应用程序。现在,我正在实现从相机胶卷中选择图像并将其上传到我们的服务器的功能。因此,我正在为 iOS 编写特定于平台的代码,这就是发生错误的地方。
我从 iOS 的特定于平台的渲染器调用 UIImagePickerController。它正常打开。但是当点击 UIImagePickerController 中的图像时,什么都没有发生,除了 Visual Studio 在调试控制台中显示一条消息:
“警告:尝试在 Xamarin_Forms_Platform_iOS_PlatformRenderer:0x153ead6a0 上呈现 Xamarin_Forms_Platform_iOS_ModalWrapper:0x155a7ed00,其视图不在窗口层次结构中!”
我用谷歌搜索,发现有人写了一个名为“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);
}
解决方案
我们遇到了类似的问题,这就是我们想出的:
var topViewController = UIApplication.SharedApplication.KeyWindow.RootViewController;
var controllerToPresentWith = topViewController.VisibleViewController();
controllerToPresentWith.PresentModalViewController(_imagePicker, true);
接着
...
public static UIViewController VisibleViewController(this UIViewController controller)
{
if (controller == null)
return null;
if (controller is UINavigationController navController)
{
return navController.VisibleViewController();
}
else if (controller is UITabBarController tabController)
{
tabController.SelectedViewController?.VisibleViewController();
}
else
{
var vc = controller.PresentedViewController?.VisibleViewController();
if (vc != null)
return vc;
}
return controller;
}
推荐阅读
- macos - 如何使用别名(MacOS)在控制台中切换scala版本?
- apache-kafka-connect - 如何使用 Debezium 连接器将 Kafka (Aiven) 连接到本地 SQL Server
- python-3.x - 在 python 3.7 中安装“hmac”包时出错
- c++ - C#WPF and C++/CLI and C++ add external library error in C++/CLI
- python - 使用 datetime 模块按给定的增量时间打印时间
- javascript - 手动更改并按下选项卡时,Angular Material 日期选择器会更改疯狂的日期
- python - 如何使用python将数据列表、数组插入数据库MySQL?
- javascript - vue.js 是否也会为 props 发生 setter/getter?
- python - Numpy memmap 第一行随机
- javafx - JavaFX 程序加载太慢