首页 > 解决方案 > QuickLook ShouldOpenUrl 委托方法未触发

问题描述

QuickLook用于预览图像、Pdf 和 Microsoft Office 文档。预览文档工作正常,但ShouldOpenUrl每当我尝试从文档打开链接时,它的委托方法都不会触发。以下是我尝试过的代码。

我使用具有 iOS v11 的 iPhone 和 iPad 测试我的应用程序。

// Open documents using title and file url
public void OpenDocument(string title, string url)
{
    var rootViewController = UIApplication.SharedApplication.KeyWindow.RootViewController;
    var previewViewController = new QLPreviewController();
    previewViewController.DataSource = new DocumentPreviewDataSource(title, url);

    previewViewController.Delegate = new PreviewControllerDelegate();

    rootViewController.PresentViewController(previewViewController, true, null);
}

// QLPreviewControllerDelegate Implementation
public class PreviewControllerDelegate : QLPreviewControllerDelegate
{
    public override bool ShouldOpenUrl(QLPreviewController controller, NSUrl url, IQLPreviewItem item)
    {
        Console.WriteLine("PreviewControllerDelegate::ShouldOpenUrl: {0}", url.AbsoluteString);
        return true;
    }
}

标签: iosswiftxamarin.iosquicklook

解决方案


您可以使用weakdelegate

public partial class xxxViewController : UIViewController,IQLPreviewControllerDelegate,IQLPreviewControllerDataSource
//. . . 

在方法 OpenDocument

public void OpenDocument()
{
  var previewViewController = new QLPreviewController();

  previewViewController.View.Frame = View.Bounds;

  previewViewController.WeakDelegate = this;

  previewViewController.WeakDataSource = this;

  this.PresentViewController(previewViewController, true,null);

}

并覆盖和中的QLPreviewControllerDelegate方法QLPreviewControllerDataSource

public nint PreviewItemCount(QLPreviewController controller)
{
  return 1;
}

public IQLPreviewItem GetPreviewItem(QLPreviewController controller, nint index)
{
  return new NSUrl("your url");
}

[Export("previewController:shouldOpenURL:forPreviewItem:")]
public bool ShouldOpenUrl(QLPreviewController controller, NSUrl url, IQLPreviewItem item)
{
    Console.WriteLine("PreviewControllerDelegate::ShouldOpenUrl: {0}", url.AbsoluteString);
    return true;
}

[Export("previewControllerWillDismiss:")]
public void WillDismiss(QLPreviewController controller)
{
   // do some thing
}

我使用上面的代码,它工作正常。


推荐阅读