2012-10-23 23 views
2

從綁定API的文檔,我使用:如何將NSDictionary()與值[PSPDFAnnotationParser類]/[MyCustomAnnotationParser類]轉換爲MonoTouch?

overrideClassNames

使用此功能可以使用,而不是默認PSPDF * 類的具體子類。例如將[PSPDFAnnotationParser class]/ [MyCustomAnnotationParser class]的條目添加爲鍵/值對,以使用自定義 子類。 (MyCustomAnnotationParser必須是 的子類PSPDFAnnotationParser)如果重寫的類是 而不是覆蓋類的子類,則會引發異常。注意:保存到磁盤時不會被序列化爲 。

@屬性(非原子,強)的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

的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)。

+0

我不得不調整它一點:oClassDic.Add(新NSObject的(新的Class( 「PSPDFAnnotationParser」)手柄),新NSObject(new Class(「PSPDFKitAnnotationParser」)。Handle)); – Krumelur

+0

現在我正面臨着本機故障。我是否必須保留對將要創建的管理對象的引用?如果是,如何? – Krumelur

+0

@Krumelur我不認爲'Class'是一個'NSObject'(至少它沒有綁定那樣),所以包裝它不可能是答案。你可能需要使用'Add'調用的低級代碼(使用'Handle')並直接調用它(發送消息)。 – poupou

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:期待一個ObjC id類型上都PARAMS

「身份證」它只是一種特殊類型,它可以容納一個指向任何對象,你可以用ObjC

0構建

所以這應該工作:)

希望這有助於

亞歷

相關問題