Mencoba menampilkan Xamarin_Forms_Platform_iOS_NavigationRenderer yang tampilannya tidak ada dalam hierarki jendela

Halo teman-teman, saya mendapat masalah ini: Mencoba menampilkan tampilan siapa yang tidak ada dalam hierarki jendela! Seseorang tahu cara membuat UINavigationController untuk membuka File PDF di iOS Saya membuat Layanan Ketergantungan untuk Android dan iOS tetapi hanya berfungsi di Android dan iOS, ada yang PDF muncul dan ada yang tidak, saya mencoba mencari cara untuk mengimplementasikan dengan UIViewController tetapi tidak berfungsi. adalah kelasnya

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;
        }


    }
}

person jorge119    schedule 28.04.2020    source sumber
comment
baris spesifik mana yang menyebabkan pengecualian?   -  person Jason    schedule 29.04.2020


Jawaban (1)


Anda dapat memeriksa jawaban ini untuk memahami pesan kesalahan yang Anda terima.

Solusi:

Hapus metode find FindNavigationController dan gunakan UIApplication.SharedApplication.KeyWindow.RootViewController.PresentViewController untuk menyajikan 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, Anda juga dapat menggunakan tampilan web untuk memuat file pdf.

person Jack Hua    schedule 29.04.2020
comment
Dan sekarang saya mendapatkan masalah ini :Peringatan: Mencoba menampilkan ‹QLPreviewController: 0x7fc73062fa00› di ‹RgPopupPlatformRenderer: 0x7fc734945370› yang sudah menampilkan ‹Rg_Plugins_Popup_IOS_Renderers_PopupPageRenderer: 0x7fc7 34944240› - person jorge119; 29.04.2020
comment
Apakah Anda memunculkan tampilan Rg_Plugins_Popup sebelum memanggil metode openpdf? Singkirkan dan tampilkan QLPreviewController. - person Jack Hua; 30.04.2020