你好,伙计们,我得到了这个问题:试图呈现在其视图不在窗口层次结构!有人知道如何创建一个UINavigationController打开一个PDF文件在iOSI创建Android和iOS的Dependecy服务,但只有在Android和iOS的工作somethings的PDF出现和somethings不我试图寻找一种方法来实现与UIViewController,但不工作这是类
public class SaveFile : ISaveFile
{
public async Task<string> SaveFiles(string filename, byte[] bytes)
{
try
{
var documentsPath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.MyDocuments);
var filePath = Path.Combine(documentsPath, filename);
File.WriteAllBytes(filePath, bytes);
OpenPDF(filePath);
//OpenFile(filePath);
return filePath;
}
catch(Exception ex)
{
Debug.WriteLine("Error" + ex.Message + ex.StackTrace);
return "";
}
}
public void OpenPDF(string filePath)
{
FileInfo fi = new FileInfo(filePath);
QLPreviewController previewController = new QLPreviewController();
previewController.DataSource = new PDFPreviewControllerDataSource(fi.FullName, fi.Name);
//UIView uIView = previewController.View;
UINavigationController controller = FindNavigationController();
controller.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
if (controller != null)
controller.PresentViewController(previewController, true,null);
}
/*
public void OpenFile(string filePath)
{
var viewer = UIDocumentInteractionController.FromUrl(NSUrl.FromFilename(filePath));
var controller = GetVisibleViewController();
viewer.PresentOpenInMenu(controller.View.Frame, controller.View, true);
}
//*/
private UINavigationController FindNavigationController()
{
foreach (var window in UIApplication.SharedApplication.Windows)
{
if (window.RootViewController.NavigationController != null)
return window.RootViewController.NavigationController;
else
{
UINavigationController val = CheckSubs(window.RootViewController.ChildViewControllers);
if (val != null)
return val;
}
}
return null;
}
private UINavigationController CheckSubs(UIViewController[] controllers)
{
foreach (var controller in controllers)
{
if (controller.NavigationController != null)
return controller.NavigationController;
else
{
UINavigationController val = CheckSubs(controller.ChildViewControllers);
if (val != null)
return val;
}
}
return null;
}
public class PDFItem : QLPreviewItem
{
string title;
string uri;
public PDFItem(string title, string uri)
{
this.title = title;
this.uri = uri;
}
public override string ItemTitle
{
get { return title; }
}
public override NSUrl ItemUrl
{
get { return NSUrl.FromFilename(uri); }
}
}
public class PDFPreviewControllerDataSource : QLPreviewControllerDataSource
{
string url = "";
string filename = "";
public PDFPreviewControllerDataSource(string url, string filename)
{
this.url = url;
this.filename = filename;
}
public override IQLPreviewItem GetPreviewItem(QLPreviewController controller, nint index)
{
return (IQLPreviewItem)new PDFItem(filename, url);
}
public override nint PreviewItemCount(QLPreviewController controller)
{
return 1;
}
}
}
你可以检查 本回答 以了解您收到的错误信息。
解决方案:
移除find FindNavigationController
方法和用途 UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController
递交 QLPreviewController
:
public void OpenPDF(string filePath)
{
FileInfo fi = new FileInfo(filePath);
QLPreviewController previewController = new QLPreviewController();
previewController.DataSource = new PDFPreviewControllerDataSource(fi.FullName, fi.Name);
UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController(previewController, true, null);
//UIView uIView = previewController.View;
//UINavigationController controller = FindNavigationController();
//controller.ModalPresentationStyle = UIModalPresentationStyle.FullScreen;
//if (controller != null)
// controller.PresentViewController(previewController, true, null);
}
另外,你也可以使用webview来加载pdf文件。