2

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

覆盖类名

使用它来使用特定的子类而不是默认的 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)
        {
        }
4

2 回答 2

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实例不是 a NSObject,它是 MonoTouch 中的 a ,因此在向字典添加值/键时NativeObject,您可能需要更深入一层并使用Handle属性 ( )。IntPtr

于 2012-10-23T12:12:38.650 回答
1

按照@poupou 的回答这可能有效,我没有测试过这是你必须做的,它有效(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:在两个参数上都需要一个 ObjCid类型

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

所以这应该工作:)

希望这可以帮助

亚历克斯

于 2012-10-24T00:47:13.497 回答