Метод делегирования QuickLook ShouldOpenUrl не запускается - PullRequest
0 голосов
/ 06 ноября 2018

Я использую QuickLook для предварительного просмотра изображений, документов в формате PDF и Microsoft Office. Он отлично работает для предварительного просмотра документов, но его метод делегата ShouldOpenUrl не запускается всякий раз, когда я пытаюсь открыть ссылку из документов. Ниже приведен код, который я попробовал.

Я тестирую свое приложение на iPhone и iPad с iOS v11.

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

1 Ответ

0 голосов
/ 07 ноября 2018

Вы можете использовать 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
}

Я использую приведенный выше код, и он отлично работает.

...