【问题标题】:How to make work UIDocumentInteractionController in MonoTouch如何在 MonoTouch 中使用 UIDocumentInteractionController
【发布时间】:2011-11-23 10:03:00
【问题描述】:

我正在尝试通过我的应用程序打开一个 *.epub 文件,但我不太明白如何使用 UIDocumentInteractionController 类来创建它。我看过官方的 IOS documentationexamples 以及一些 examples over the net 但我不明白那个类是如何工作的。这就是我的做法,我的成就和我不明白的:

我有一个带有 UIButton 的 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 文件,结果相同。

【问题讨论】:

  • 我刚试过你的例子,我得到的错误是: UIDocumentInteractionController: invalid scheme http.仅支持文件方案。

标签: c# delegates xamarin.ios monodevelop uidocumentinteraction


【解决方案1】:

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

如果我能提供解决方法,我会调查此错误并更新此答案(直到该错误在 MonoTouch 的未来版本中得到正确修复)。

更新UIDocumentInteractionController 已经创建了它自己的内部UIDocumentInteractionControllerDelegate,所以你不需要创建一个。委托方法,如 DidDismissOpenInMenu 可作为 UIDocumentInteractionController 本身的事件使用。

删除你自己的委托(创建和设置)并使用事件,你应该没问题。

更新 #2Delegate 属性返回 null,因为默认的 UIDocumentInteractionControllerDelegate 不能按原样使用。它是为了继承和定制来做你想做的事情(并且 unusable 默认的未正确注册以供使用)。例如

class MyDocumentInteractionControllerDelegate : UIDocumentInteractionControllerDelegate { }

var dicDel = new MyDocumentInteractionControllerDelegate ();

工作,就像没有NullReferenceException一样,但DidDismissOpenInMenu当然不会做任何有趣的事情。

【讨论】:

  • 感谢您的回答 poupou,我已经解决了这个问题。实际上,委托没有实例化,如果您想自己处理它的事件,您需要创建一个继承 UIDocumentInteractionControllerDelegate 类并覆盖这些方法的类,但如果您只想显示选项/预览/openIn 菜单,则不需要完全需要委托。
  • 好的,我正在寻找我的代码,但我现在没有,所以我明天会发布它,保证。关键是我在调用它之后错过了如何保留对象,我需要将 DocumentInteractionController 声明为属性并将其放入 [Export ("PresentOptionsMenu", MonoTouch.ObjCRuntime.ArgumentSemantic.Retain)] 属性
  • 提供 xxxDelegate 是可选,并允许您自定义主类(在这种情况下为UIDocumentInteractionController)。 MonoTouch 始终支持这一点 - 但基类 xxxDelegate 无济于事,因为它没有做任何事情(直到你从它继承)。包括UIDocumentInteractionController 在内的某些类型还可选地 隐藏 xxxDelegate(它使用内部的)并允许您使用C# 事件进行自定义(对.NET 更友好)。
猜你喜欢
  • 2012-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-27
  • 2020-06-06
相关资源
最近更新 更多