C# 如何在MonoTouch中制作工作UIDocumentInteractionController

C# 如何在MonoTouch中制作工作UIDocumentInteractionController,c#,delegates,xamarin.ios,monodevelop,uidocumentinteraction,C#,Delegates,Xamarin.ios,Monodevelop,Uidocumentinteraction,我试图通过我的应用程序打开一个*.epub文件,但我不太明白如何使用UIDocumentInteractionController类来创建它。我看过官方的IOS和其他一些版本,但我不明白这个类是如何工作的。我就是这样做的,我取得了什么成就,我不了解什么: 我有一个带有UIView按钮的UIView: using MonoTouch.UIKit; using MonoTouch.Foundation; using System.Drawing; public class MyView : UIV

我试图通过我的应用程序打开一个*.epub文件,但我不太明白如何使用UIDocumentInteractionController类来创建它。我看过官方的IOS和其他一些版本,但我不明白这个类是如何工作的。我就是这样做的,我取得了什么成就,我不了解什么:

我有一个带有UIView按钮的UIView:

using MonoTouch.UIKit;
using MonoTouch.Foundation;
using System.Drawing;

public class MyView : UIViewController
{
    UIButton myBtn;

    public MyView() :base()
    {
        View.Frame = new RectangleF(0,0,1024,768);

        var myRect = new RectangleF(300,300,100,50);

        myBtn = UIButton.FromType(UIButtonType.RoundedRect);
        myBtn.Frame = myRect;
        myBtn.TouchUpInside += delegate
        {
            var dic = UIDocumentInteractionController.FromUrl(new NSUrl("http://192.168.50.50:2020/myfile.epub"));
            var dicDel = new UIDocumentInteractionControllerDelegate();
            dic.Delegate = dicDel;

            InvokeOnMainThread(delegate
            {
                var result = dic.PresentOpenInMenu(myRect, View, true);
                //If I do this -> NullReferenceException because delegate is null (something about autorelease?? Don't know)
                if(!result) dic.Delegate.DidDismissOpenInMenu(dic);
            });


        }
    }
}
最奇怪的是,如果我在调用PresentOpenInMenu方法之前没有委托调试和检查dic,它会显示菜单返回true,但在这样做之后,应用程序在Main.cs上爆炸,因为我不理解自动释放的事情

我有点迷路了。有人能帮我理解这门课吗?我怎样才能使它正常工作?提前谢谢


编辑:顺便说一下,我也使用了一个*.txt文件,结果相同。

它看起来像一个MonoTouch bug。设置UIDocumentInteractionController.Delegate或WeakDelegate属性,然后查询其值将返回null,稍后将失败

如果我能提供一个解决方法,我将研究这个bug并更新这个答案,直到在未来的MonoTouch版本中该bug被正确修复

更新:UIDocumentInteractionController已经创建了它自己的内部UIDocumentInteractionControllerDelegate,所以您不需要创建一个。委托方法(如DidDismissOpenInMenu)在UIDocumentInteractionController本身上作为事件提供

删除您自己的代理创建并设置和使用事件,您应该会没事的

更新2:委托属性返回null,因为默认的UIDocumentInteractionControllerDelegate无法按原样使用。这意味着要从中继承并自定义以执行您想要的操作,而不可用的默认值没有正确注册以供使用。例如

class MyDocumentInteractionControllerDelegate : UIDocumentInteractionControllerDelegate { }


在无NullReferenceException中会起作用,但当然DidDismissOpenInMenu不会做任何有趣的事情。

谢谢你的回答,poupou,我已经解决了这个问题。实际上,委托不是实例化的,如果您想自己处理其事件,则需要创建一个继承UIDocumentInteractionControllerDelegate类并重写这些方法的类,但是如果你只想在菜单中显示选项/预览/打开,你根本不需要代理。好的,我正在寻找我的代码,但我现在没有,所以我明天会发布,保证。关键是调用对象后,我缺少如何保留该对象,我需要将DocumentInteractionController声明为属性,并将其放入[Export PresentOptions Menu,MonoTouch.ObjCRuntime.ArgumentSemantic.retain]属性提供xxxDelegate是可选的,在本例中允许您自定义主类UIDocumentInteractionController。MonoTouch始终支持这一点,但基本xxxDelegate类不会有帮助,因为在您继承它之前,它不会做任何事情。某些类型(包括UIDocumentInteractionController)还可以选择隐藏xxxDelegate,因为它使用内部的xxxDelegate,并允许您使用更为.NET友好的C事件进行自定义。我刚刚尝试了您的示例,得到的错误是:UIDocumentInteractionController:invalid scheme http。仅支持文件方案。
var dicDel = new MyDocumentInteractionControllerDelegate ();