对于有效协议,MonoTouch conformsToProtocol = False

时间:2013-06-25 18:43:58

标签: c# ios binding xamarin.ios

我创建了bindings for AQGridView。该项目有一个委托和数据源协议。

类型AQGridView会公开GridViewDataSourceGridViewDelegate属性。使用自定义类设置任一属性时,会从有界库(而不是运行时)中获取错误。有消息是:

  

-setDataSource的参数必须符合AQGridViewDataSource   协议

通过在objective-c库中调用“conformsToProtocol”手动抛出此错误。

- (void) setDataSource: (id<AQGridViewDataSource>) obj
{
    if ((obj != nil) && ([obj conformsToProtocol: @protocol(AQGridViewDataSource)] == NO ))
        [NSException raise: NSInvalidArgumentException format: @"Argument to -setDataSource must conform to the AQGridViewDataSource protocol"];

    _dataSource = obj;

    _flags.dataSourceGridCellSize = [obj respondsToSelector: @selector(portraitGridCellSizeForGridView:)];
}

委托没有必需的方法,因此很容易“符合”,对于数据源,我已经实现了所有必需的字段。所以问题是:

当我发送的托管类型继承正确类型并实现所需方法(如果有)时,为什么conformsToProtocol在iOS中返回NO?

更新

我在c#类型上覆盖了ConformsToProtocol,以便让iOS类型的方法通过。

public override bool ConformsToProtocol (IntPtr protocol)
{
    return true;
}

我仍然认为我不需要这样做,但它现在有效。

1 个答案:

答案 0 :(得分:1)

您已正确完成此操作,即使它们从正确的绑定类/协议继承,我们当前也不会针对托管类自动响应conformsToProtocol为YES。