Monotouch / Xamarin绑定继承

时间:2013-11-05 16:56:21

标签: c# ios xamarin.ios xamarin

我正在尝试为FastPDFKit实现单触式绑定。我在使用继承的构造函数时遇到问题。我正在尝试从fastPDFKit绑定“ReaderViewController”。 ReaderViewController继承自继承自UIViewController的MFDocumentViewController。

我的C#

NSUrl fullURL = new NSUrl (fullPath);
FastPDFKitBinding.MFDocumentManager DocManager = new FastPDFKitBinding.MFDocumentManager (fullURL);

DocManager.EmptyCache ();


//line where the errors occur
FastPDFKitBinding.ReaderViewController pdfView = new FastPDFKitBinding.ReaderViewController (DocManager); 
pdfView.DocumentID = PageID.ToString ();

Source.PView.PresentViewController(pdfView, true, null);

这个代码没有构建,在制作新的ReaderViewController时给了我两个错误:

Error CS1502: The best overloaded method match for `FastPDFKitBinding.ReaderViewController.ReaderViewController(MonoTouch.Foundation.NSCoder)' has some invalid arguments (CS1502) (iOSFlightOpsMobile)

Error CS1503: Argument `#1' cannot convert `FastPDFKitBinding.MFDocumentManager' expression to type `MonoTouch.Foundation.NSCoder' (CS1503) (iOSFlightOpsMobile)

我的约束力的相关部分

namespace FastPDFKitBinding
{
    [BaseType (typeof (UIAlertViewDelegate))]
    interface MFDocumentManager {

        [Export ("initWithFileUrl:")]
        IntPtr Constructor (NSUrl URL);

        [Export ("emptyCache")]
        void EmptyCache ();

        [Export ("release")]
        void Release ();
    }

    [BaseType (typeof (UIViewController))]
    interface MFDocumentViewController {
        [Export ("initWithDocumentManager:")]
        IntPtr Constructor (MFDocumentManager docManager);

        [Export ("documentId")]
        string DocumentID { get; set; }

        [Export ("documentDelegate")]
        NSObject DocumentDelegate { set; }
    }

    [BaseType (typeof (MFDocumentViewController))]
    interface ReaderViewController {

    }
}

现在,我可以通过从MFDocumentViewController获取绑定Exports并将它们放在我的ReaderViewController接口中来消除错误。

    [BaseType (typeof (UIViewController))]
interface MFDocumentViewController {

}

[BaseType (typeof (MFDocumentViewController))]
interface ReaderViewController {
    [Export ("initWithDocumentManager:")]
    IntPtr Constructor (MFDocumentManager docManager);

    [Export ("documentId")]
    string DocumentID { get; set; }

    [Export ("documentDelegate")]
    NSObject DocumentDelegate { set; }
}

但我不想这样做,因为那些构造函数/方法是在MFDocumentViewController中定义的。如何让绑定正确使用那些继承的方法/构造函数。

1 个答案:

答案 0 :(得分:3)

您的修复是正确的实施。

.NET中的Ctor继承(可能还有所有OO语言)都需要定义基本ctor。让我举个例子。

这很好用

class A {
    public A (string m) {}
}

class B : A{
    public B (string m) : base (m) {}
}

class C : B {
    public C (string m) : base (m) {}
}

当您执行new C("hello")时,A的ctor,然后是B,然后使用参数执行C.

这不起作用:

class A {
    public A (string m) {}
}

class B : A {
    public B () : base ("empty") {}
}

class C : B {
    public C (string m) : base (m) {}
}

原因是编译器必须调用B ctor(因为C继承它)但不知道要使用哪个ctor。

因此,在将obj-C库绑定到monotouch时,请确保重新声明可能需要在某个时刻调用的所有构造函数。