1

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

我的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 获取绑定导出并将它们放入我的 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 中定义的。如何让绑定正确使用那些继承的方法/构造函数。

4

1 回答 1

3

您的修复是正确的实现。

.NET(可能还有所有 OO 语言)中的 ctor 继承需要定义基本 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、B、C 的 ctor。

这不起作用:

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。

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

于 2013-11-05T20:20:45.317 回答