Xamarin iOS EventArgs缺少第一个属性

时间:2017-03-31 13:11:16

标签: xamarin binding xamarin.ios eventargs

在委托方法上使用EventArgs属性时,它会生成事件处理程序类,其属性基于除第一个方法之外的方法参数。

生成的事件args类中缺少第一个参数。

例如:

[Protocol, Model]
[BaseType(typeof(NSObject))]
public interface TestDelegate
{
    // @required -(void)DidReceiveFrom:(NSString * _Nonnull)p1 withP2:(NSString * _Nonnull)p2 withP3:(NSString * _Nonnull)p3 withP4:(NSString * _Nonnull)p4;
    [Abstract]
    [Export("DidReceiveFrom:withP2:withP3:withP4:")]
    [EventArgs("DidReceiveFrom")]
    void DidReceiveFrom(string p1, string p2, string p3, string p4);

然后生成的EventArgs类变为:

//
// EventArgs classes
//
public partial class DidReceiveFromEventArgs : EventArgs {
    public DidReceiveFromEventArgs (string p2, string p3, string p4)
    {
        this.p2 = p2;
        this.p3 = p3;
        this.p4 = p4;
    }
    public string p2 { get; set; }
    public string p3 { get; set; }
    public string p4 { get; set; }
}

所以它绝对缺少p1属性。如何避免这种行为?

2 个答案:

答案 0 :(得分:0)

我猜您正在使用 echo ' <div class="label-container"> <input type="checkbox" name="services[]" id="'.$value['services'].'" value="HairCut"> <label for="Haircut">Haircut</label> </div> '; 工具为Objective C API生成C#代码。

如果是这样,那么,基本上你需要记住它是一个帮助工具,但不是100%保证它会为你获得正确的C#代码。

无论如何,最简单的解决方法是手动编辑C#代码并在错过时添加此参数。

您没有显示objective sharpie的C#代码。可能是你有第一个参数作为发送者,然后所有其他3个参数作为事件参数?

如果是这种情况,请在C#API中注释TestDelegate属性并重新编译绑定。

答案 1 :(得分:0)

根据Xamarin文档,此行为是默认行为:

  

对于带有多个参数的事件(在Objective-C中,约定是委托类中的第一个参数是发送方对象的实例),您必须为生成的EventArgs类提供所需的名称。是。这是通过Model类中方法声明的EventArgs属性完成的。

https://developer.xamarin.com/guides/cross-platform/macios/binding/binding-types-reference/#EventArgsAttribute

似乎我生成绑定的源库中的委托并不严格遵循此规则,第一个参数是字符串形式的半发件人。