如何使用Xamarin在iPad上实现UIDocumentInteractionController

4
我正在使用Xamarin开发一个iPad iOS 7.0应用程序,想要使用UIDocumentInteractionController来显示PDF文档。我在Stack Overflow上使用了各种示例来获取正确的实现方法,但没有任何效果。
这是我在Stack Overflow上用作参考的链接。 Monotouch open document - UIDocumentInterationController 我还使用了这个Objective-C教程,但一直无法将其代码正确地转换为C#。 http://code.tutsplus.com/tutorials/previewing-and-opening-documents-with-uidocumentinteractioncontroller--mobile-15130 这是我的代码。我目前有一个工具栏按钮,当单击时应该触发PDF预览。单击按钮时没有任何反应。
我缺少什么才能使其正常工作?
public override void ViewDidLoad ()
{
    base.ViewDidLoad ();

    documentInteractionController = new UIDocumentInteractionController ();

    string fileName = "Content/test.pdf";
    string localURL = Path.Combine (NSBundle.MainBundle.BundlePath, fileName);
    NSUrl URL = new NSUrl(localURL, false);

    documentInteractionController = UIDocumentInteractionController.FromUrl (URL);
    documentInteractionController.Delegate = new UIDocumentInteractionControllerDelegateClass(this);

    toolbarButton.Clicked += delegate(object sender, EventArgs e){
        InvokeOnMainThread(delegate{
            documentInteractionController.PresentOpenInMenu(View.Frame, View, true);
        });
    };
}


public class UIDocumentInteractionControllerDelegateClass : UIDocumentInteractionControllerDelegate
{
    UIViewController viewC;

    public UIDocumentInteractionControllerDelegateClass(UIViewController controller)
    {
        viewC = controller;
    }

    public override UIViewController ViewControllerForPreview (UIDocumentInteractionController controller)
    {
        return viewC;
    }

    public override UIView ViewForPreview (UIDocumentInteractionController controller)
    {
        return viewC.View;
    }

    public override RectangleF RectangleForPreview (UIDocumentInteractionController controller)
    {
        return viewC.View.Frame;
    }
}
3个回答

3
经过对这个问题的研究,询问其他论坛上同样的问题,并使用不同的代码示例,我无法使用C#中的UIDocumentInteractionController使此代码正常工作。然而,我可以使用上面问题中链接的objective-c教程让它正常工作。这并不有用,因为我需要C#代码而不是objective-c。
在我的研究中,我在Stack Overflow上发现了这篇文章,其中使用了QLPreviewController。 Monotouch - Issue with QLPreviewController 这段代码提供了我应用所需的一切。我对原始PDF位置进行了一次更改,它按预期工作。
这是我正在使用的从上面的帖子中获取并修改的代码,用于打开具有“打开”功能的快速预览控件中的PDF。
以下是控制器的代码:
QLPreviewController previewController= new QLPreviewController();             

previewController.DataSource=new MyQLPreviewControllerDataSource();     

this.PresentViewController(previewController,true, null);

这是数据源的代码:
public class MyQLPreviewControllerDataSource : QLPreviewControllerDataSource { 

    public override int PreviewItemCount (QLPreviewController controller) {
        return 1;
    }

    public override QLPreviewItem GetPreviewItem (QLPreviewController controller, int index)
    {
        string fileName = @"example.pdf";
        var documents = NSBundle.MainBundle.BundlePath;
        var library = Path.Combine (documents,fileName);
        NSUrl url = NSUrl.FromFilename (library);
        return new QlItem ("Title", url);
    }
}

这是QlItem的代码:
public class QlItem : QLPreviewItem 
    { 
        string title; 
        NSUrl uri; 

        public QlItem(string title, NSUrl uri) 
        { 
            this.title = title; 
            this.uri = uri; 
        } 

        public override string ItemTitle { 
            get { return title; } 
        } 

        public override NSUrl ItemUrl { 
            get { return uri; } 
        } 
    }

你能检测到用户选择在外部应用程序中打开文件吗? - nhenrique
据我所知,iOS上的应用程序不能相互通信,这是设计上的限制。因此,无法检测用户是否选择在外部应用程序中打开文件。如果有可能,我也想知道如何实现。 - Shawn Roser
1
嗨 @ShawnRoser,请看一下这个链接:http://stackoverflow.com/questions/30298405/detect-when-user-opens-file-in-app/30304547#30304547。你可以检测用户选择了哪个应用程序,并可能显示一个加载页面,直到事件didEndSendingToApplication被调用。 - nhenrique

1
如果有人遇到这个问题,这可能会有所帮助。
在iOS模拟器中打开其他应用程序中的文件无法正常工作,因为它看不到任何其他应用程序。因此,您应该在物理设备上进行测试。
此外,您需要提供UIDocumentInteractionController的Uti,如下所示:
documentInteractionController.Uti = @"com.adobe.pdf"

这个 Xamarin 论坛主题 作为例子。


1

对我在毛伊岛有效的是:

    MainThread.BeginInvokeOnMainThread(() =>
    {
        try
        {
            var documentInteractionController = new UIDocumentInteractionController();

            NSUrl URL = new NSUrl(fullFilename, false);

            documentInteractionController = UIDocumentInteractionController.FromUrl(URL);

            var view = Platform.GetCurrentUIViewController().View;
            documentInteractionController.PresentOpenInMenu(view.Frame, view, true);
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }

    });

fullFilename是文件名,包括您在应用沙盒位置保存的完整本地路径。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接