【问题标题】:How to implement UIDocumentInteractionController on iPad using Xamarin如何使用 Xamarin 在 iPad 上实现 UIDocumentInteractionController
【发布时间】:2014-02-20 16:04:15
【问题描述】:

我正在使用 Xamarin 开发 iPad iOS 7.0 应用程序,并且我想使用 UIDocumentInteractionController 来显示 PDF。我在 Stack Overflow 上使用了各种示例来获得正确的实现,但没有任何效果。

这是 Stack Overflow 上的一个链接,我用作参考。

Monotouch open document - UIDocumentInterationController

我也使用了这个客观的 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;
    }
}

【问题讨论】:

    标签: c# ios ipad xamarin uidocumentinteraction


    【解决方案1】:

    在研究了这个问题后,在另一个论坛上提出了同样的问题,并使用了不同的代码示例,我无法使用 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 上的应用程序无法相互通信,这是设计使然。在这方面,无法检测用户是否选择在外部应用程序上打开文件。如果可能,那么我也想知道它是如何完成的。
    • 嗨@ShawnRoser,请看一下stackoverflow.com/questions/30298405/…。您可以检测用户选择了哪个应用程序,并可能在调用事件 didEndSendingToApplication 之前显示加载
    【解决方案2】:

    如果偶然发现这个问题,这可能会对某人有所帮助。

    在其他应用中打开文件在 iOS 模拟器中不起作用,因为它看不到任何其他应用。所以你应该在物理设备上测试它

    您还需要像这样为 UIDocumentInteractionController 提供 Uti:

    documentInteractionController.Uti = @"com.adobe.pdf"
    

    this xamarin forum topic 为例。

    【讨论】:

      猜你喜欢
      • 2013-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-10
      • 2011-08-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多