为什么我需要在托管包装器Delegate对象中覆盖可选的ObjC方法?

时间:2011-03-10 10:13:47

标签: c# iphone binding xamarin.ios

以下是该方案:

我已使用btouch工具成功绑定了原生ObjC库中的两个对象。绑定对象是一个类和一个充当其Delegate对象的协议。 Delegate对象包含必需和可选方法。我已经包含了它需要工作的额外枚举。所有内容都编译完美,除了如果我不覆盖托管的Delegate类中的某些可选方法,我得到一个You_Should_Not_Call_base_In_This_Method异常。

这就是我为协议创建API定义的方法(虚拟方法名称):

[BaseType(typeof(NSObject))]
[Model]
interface TheDelegate
{
    #region Required
    [Abstract]
    [Export("requiredMethod:")]
    void RequiredMethod(string par);
    #endregion Required

    #region Optional
    [Export("optMethod:")]
    void OptMethod(string par);
    #endregion Optional
}

如果我将OptMethod从定义中删除,应用程序就会完美执行。但是在这种情况下,当我需要时,该方法将无法覆盖,我将不得不创建一个包含btouch的新程序集。

所以当我继承这样的Delegate对象时:

private class MyDelegate : TheDelegate
{
    public override void RequiredMethod(string par)
    {
        //inside RequiredMethod override
    }
}

我得到了

  

... base_In_This_Method

OptMethod方法中的

异常。但如果我以相同的方式继承它,但API定义不包含OptMethod,一切正常。

有什么想法吗?

1 个答案:

答案 0 :(得分:2)

这是我们本周解决的MonoTouch运行时中的一个错误。它将在MonoTouch的下一个alpha版本中修复。