Xamarin.ios 如何将值为[PSPDAnnotationParser类]/[MyCustomAnnotationParser类]的NSDictionary()转换为MonoTouch?
根据我正在使用的绑定API的文档: 重写类名 使用此选项可以使用特定的子类,而不是默认的PSPDF* 上课。e、 g.添加[PSPDFAnnotationParser类]的条目/ [MyCustomAnnotationParser类]作为键/值对使用自定义 子类。(MyCustomAnnotationParser必须是的子类 如果重写类为 不是重写类的子类。注意:不会被序列化 保存到磁盘时 @属性(非原子,强)NSDictionary*重写ClassNames 这是我试过但没用的。显然不是字符串是必需的,而是实际的类型或其他东西。我如何在MonoTouch中使用此功能Xamarin.ios 如何将值为[PSPDAnnotationParser类]/[MyCustomAnnotationParser类]的NSDictionary()转换为MonoTouch?,xamarin.ios,nsdictionary,Xamarin.ios,Nsdictionary,根据我正在使用的绑定API的文档: 重写类名 使用此选项可以使用特定的子类,而不是默认的PSPDF* 上课。e、 g.添加[PSPDFAnnotationParser类]的条目/ [MyCustomAnnotationParser类]作为键/值对使用自定义 子类。(MyCustomAnnotationParser必须是的子类 如果重写类为 不是重写类的子类。注意:不会被序列化 保存到磁盘时 @属性(非原子,强)NSDictionary*重写ClassNames 这是我试过但没用的。显然不是字符串
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)
选择器要求两个参数上都有ObjCid
类型
“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;