Xamarin.ios 如何将值为[PSPDAnnotationParser类]/[MyCustomAnnotationParser类]的NSDictionary()转换为MonoTouch?

Xamarin.ios 如何将值为[PSPDAnnotationParser类]/[MyCustomAnnotationParser类]的NSDictionary()转换为MonoTouch?,xamarin.ios,nsdictionary,Xamarin.ios,Nsdictionary,根据我正在使用的绑定API的文档: 重写类名 使用此选项可以使用特定的子类,而不是默认的PSPDF* 上课。e、 g.添加[PSPDFAnnotationParser类]的条目/ [MyCustomAnnotationParser类]作为键/值对使用自定义 子类。(MyCustomAnnotationParser必须是的子类 如果重写类为 不是重写类的子类。注意:不会被序列化 保存到磁盘时 @属性(非原子,强)NSDictionary*重写ClassNames 这是我试过但没用的。显然不是字符串

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

重写类名

使用此选项可以使用特定的子类,而不是默认的PSPDF* 上课。e、 g.添加[PSPDFAnnotationParser类]的条目/ [MyCustomAnnotationParser类]作为键/值对使用自定义 子类。(MyCustomAnnotationParser必须是的子类 如果重写类为 不是重写类的子类。注意:不会被序列化 保存到磁盘时

@属性(非原子,强)NSDictionary*重写ClassNames

这是我试过但没用的。显然不是字符串是必需的,而是实际的类型或其他东西。我如何在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)
        {
        }

MonoTouch自己的绑定通常会隐藏并替换为more.NETy,
System.Type

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

var oClassDic = new NSMutableDictionary();
oClassDic.Add(new Class("PSPDFAnnotationParser"), new Class("PSPDFKitAnnotationParser"));
oDoc.OverrideClassNames = oClassDic;
由于
实例不是
NSObject
,它是MonoTouch中的
NativeObject
,因此您可能需要更深一层并使用
句柄
属性(
IntPtr
)在向字典添加值/键时。

遵循@poupou答案这可能有效,我没有测试过它这是你必须做的,它有效(TM)

选择器要求两个参数上都有ObjC
id
类型

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

所以这应该是可行的:)

希望这有帮助


Alex

我不得不对它进行一些调整:oClassDic.Add(new-NSObject(new-Class(“PSPDFAnnotationParser”).Handle),new-NSObject(new-Class(“PSPDFKitAnnotationParser”).Handle);现在我面临着一场本地崩溃。我是否必须保留对将创建的托管对象的引用?如果是:怎么做?@Krumelur我不认为
Class
是一个
NSObject
(至少它不是那样绑定的),所以包装它不太可能是答案。您可能需要使用
Add
正在调用的低级代码(使用
Handle
)并直接调用它(发送消息)。@poupou可能是对NSMutableDictionary.Add()的单触式增强功能可以公开一个在两个参数中都接受IntPtr的重载,以便捕获所需类未从NSObjects继承的特殊情况。请明确说明:如果我以发布的方式使用它,我将在自定义类中被回调!如果包装不起作用,这就不会发生,还是我错了?
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;