2

私が使用しているバインドされた 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)
        {
        }
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インスタンスは ではなく、 MonoTouchNSObjectのであるため、これを少し調整する必要がある場合があります。そのため、ディクショナリに値/キーを追加するときにNativeObject、1 レベル深くしてHandleプロパティ ( ) を使用する必要がある場合があります。IntPtr

于 2012-10-23T12:12:38.650 に答える
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:両方のパラメーターで ObjCidタイプが必要です

「id」は、ObjC で構築できる任意のオブジェクトへのポインターを保持できる特別な型です。

だからこれはうまくいくはずです:)

お役に立てれば

アレックス

于 2012-10-24T00:47:13.497 に答える