如何将值为[PSPDFAnnotationParser类] / [MyCustomAnnotationParser类]的NSDictionary()转换为MonoTouch?

时间:2012-10-23 08:05:08

标签: xamarin.ios nsdictionary

从我正在使用的绑定API的文档:

  

overrideClassNames

     

使用它来使用特定的子类而不是默认的PSPDF *   类。例如添加[PSPDFAnnotationParser类]的条目/   [MyCustomAnnotationParser类]作为键/值对使用自定义   子类。 (MyCustomAnnotationParser必须是。的子类   PSPDFAnnotationParser)如果覆盖类是,则抛出异常   不是重写类的子类。注意:不会被序列化   保存到磁盘时。

     

@property(nonatomic,strong)NSDictionary * overrideClassNames

这是我尝试但不起作用的。显然不是字符串是必需的,但实际的类型或东西。我如何在MonoTouch中使用它?

var oClassDic = new NSMutableDictionary();
oClassDic.Add(new NSString("[PSPDFAnnotationParser class]"), new NSString("[PSPDFKitAnnotationParser class]"));
oDoc.OverrideClassNames = oClassDic;

我创建的PSPDFKitAnnotationParser如下:

[Register("PSPDFKitAnnotationParser")]
    public class PSPDFKitAnnotationParser : PSPDFAnnotationParser
    {
        public PSPDFKitAnnotationParser () : base()
        {
        }

        public PSPDFKitAnnotationParser (PSPDFDocumentProvider provider) : base(provider)
        {
        }

        public PSPDFKitAnnotationParser (IntPtr handle) : base(handle)
        {
        }

        public PSPDFKitAnnotationParser (NSObjectFlag t) : base(t)
        {
        }

        public PSPDFKitAnnotationParser (NSCoder coder) : base(coder)
        {
        }

2 个答案:

答案 0 :(得分:2)

MonoTouch自己的绑定通常会隐藏class并将其替换为.NETy System.Type

但是MonoTouch.ObjCRuntime.Class类型存在并且也可以使用。如果本机代码需要class个实例,那么您应该可以执行以下操作:

var oClassDic = new NSMutableDictionary();
oClassDic.Add(new Class("PSPDFAnnotationParser"), new Class("PSPDFKitAnnotationParser"));
oDoc.OverrideClassNames = oClassDic;

您可能需要稍微调整一下,因为Class实例不是NSObject,它在MonoTouch中是NativeObject,因此您可能需要更深入一级并使用在您的词典中添加值/键时,Handle属性(IntPtr)。

答案 1 :(得分:1)

关注@poupou回答这可能有用,我还没有测试过它这就是你要做的事情,It Works(TM)

var oClassDic = new NSMutableDictionary();
var key = new Class("PSPDFAnnotationParser");
var val = new Class("PSPDFKitAnnotationParser");

IntPtr selSetObjectForKey = Selector.GetHandle ("setObject:forKey:");

Messaging.void_objc_msgSend_IntPtr_IntPtr (oClassDic.Handle, selSetObjectForKey, val.Handle, key.Handle);

oDoc.OverrideClassNames = oClassDic;

选择器setObject: forKey:期望两个参数上的ObjC id类型

  

“id”它只是一个特殊的类型,可以保存指向你可以使用ObjC构造的任何对象的指针

所以这应该有效:)

希望这有帮助

亚历