C# 如何使用Xamarin在iPad上实现UIDocumentInteractionController
我正在使用Xamarin开发一个iPad iOS 7.0应用程序,我想使用UIDocumentInteractionController来显示PDF。我使用了各种有关堆栈溢出的示例来获得正确的实现,但没有任何效果 这里有一个关于堆栈溢出的链接,我用它作为参考 我也使用了这个objective C教程,但无法正确地将代码翻译成C。 这是我的密码。我目前有一个工具栏按钮,当点击它时,应该会触发PDF预览。当我点击按钮时,什么也没有发生 我错过了什么才能让它发挥作用C# 如何使用Xamarin在iPad上实现UIDocumentInteractionController,c#,ios,ipad,xamarin,uidocumentinteraction,C#,Ios,Ipad,Xamarin,Uidocumentinteraction,我正在使用Xamarin开发一个iPad iOS 7.0应用程序,我想使用UIDocumentInteractionController来显示PDF。我使用了各种有关堆栈溢出的示例来获得正确的实现,但没有任何效果 这里有一个关于堆栈溢出的链接,我用它作为参考 我也使用了这个objective C教程,但无法正确地将代码翻译成C。 这是我的密码。我目前有一个工具栏按钮,当点击它时,应该会触发PDF预览。当我点击按钮时,什么也没有发生 我错过了什么才能让它发挥作用 public覆盖void Vi
public覆盖void ViewDidLoad()
{
base.ViewDidLoad();
documentInteractionController=新UIDocumentInteractionController();
string fileName=“Content/test.pdf”;
字符串localURL=Path.Combine(NSBundle.MainBundle.BundlePath,文件名);
NSUrl URL=新的NSUrl(localURL,false);
documentInteractionController=UIDocumentInteractionController.FromUrl(URL);
documentInteractionController.Delegate=新的UIDocumentInteractionControllerDelegateClass(此);
toolbarButton.Clicked+=委托(对象发送者,事件参数e){
调用主线程(委托{
documentInteractionController.PresentOpenMenu(View.Frame,View,true);
});
};
}
公共类UIDocumentInteractionControllerDelegateClass:UIDocumentInteractionControllerDelegate
{
UIVIEW控制器viewC;
公共UIDocumentInteractionControllerDelegateClass(UIViewController控制器)
{
viewC=控制器;
}
公共覆盖UIViewController ViewControllerForPreview(UIDocumentInteractionController控制器)
{
返回viewC;
}
公共覆盖UIView视图预览(UIDocumentInteractionController)
{
返回viewC.View;
}
公共覆盖矩形F矩形预览(UIDocumentInteractionController)
{
返回viewC.View.Frame;
}
}
在研究了这个问题后,在另一个论坛上问了相同的问题,并使用了不同的代码示例,我无法使用C#中的UIDocumentInteractionController使此代码正常工作。但是,我可以使用上面问题中链接的objective-c教程使其工作。这没有用,因为我需要C#而不是objective-C中的代码
在我的研究中,我发现了这篇关于堆栈溢出的文章,它使用了一个QLEVIEWCONTROLLER
这段代码正好提供了我的应用程序所需的内容。我对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; }
}
}
如果偶然发现这个问题,这可能会对某人有所帮助 在其他应用中打开文件在iOS模拟器中不起作用,因为它看不到任何其他应用。所以你应该在物理设备上测试它 您还需要为UIDocumentInteractionController提供Uti,如下所示:
documentInteractionController.Uti = @"com.adobe.pdf"
例如使用。您能检测到用户是否选择在外部应用程序上打开文件吗?@nhenrique据我所知,iOS上的应用程序无法相互通信,这是出于设计。在这方面,无法检测用户是否选择在外部应用程序上打开文件。如果可能的话,那么我也想知道它是如何完成的。您好@ShawnRoser,请看一下。您可以检测用户选择的应用程序,并可能在调用事件didEndSendingToApplication之前显示加载