พยายามนำเสนอ Xamarin_Forms_Platform_iOS_NavigationRenderer ซึ่งมุมมองไม่อยู่ในลำดับชั้นของหน้าต่าง

สวัสดีทุกคน ฉันได้รับปัญหานี้: พยายามนำเสนอว่ามุมมองที่ไม่อยู่ในลำดับชั้นของหน้าต่าง! มีคนรู้วิธีสร้าง UINavigationController เพื่อเปิดไฟล์ PDF ใน iOS ฉันสร้างบริการ Dependecy สำหรับ Android และ iOS แต่ใช้งานได้เฉพาะใน Android และ iOS บางอย่างที่มี PDF ปรากฏขึ้นและบางสิ่งที่ฉันไม่ได้ลองค้นหาวิธีการนำไปใช้กับ 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;
        }


    }
}

comment
บรรทัดใดที่ทำให้เกิดข้อยกเว้น   -  person Jason    schedule 29.04.2020


คำตอบ (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);


    }

BTW คุณสามารถใช้ webview เพื่อโหลดไฟล์ pdf ได้

person Jack Hua    schedule 29.04.2020
comment
และตอนนี้ฉันได้รับปัญหานี้ :คำเตือน: พยายามนำเสนอ ‹QLPreviewController: 0x7fc73062fa00› บน ‹RgPopupPlatformRenderer: 0x7fc734945370› ซึ่งนำเสนออยู่แล้ว ‹Rg_Plugins_Popup_IOS_Renderers_PopupPageRenderer: 0x7fc734944240› - person jorge119; 29.04.2020
comment
คุณเปิดมุมมอง Rg_Plugins_Popup ก่อนที่จะเรียกใช้วิธี openpdf หรือไม่ ยกเลิกและนำเสนอ QLPreviewController - person Jack Hua; 30.04.2020