【问题标题】:Xamarin iOS EventArgs missing first propertyXamarin iOS EventArgs 缺少第一个属性
【发布时间】:2017-08-25 18:42:02
【问题描述】:

在委托方法上使用 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 属性。如何避免这种行为?

【问题讨论】:

    标签: xamarin binding xamarin.ios eventargs


    【解决方案1】:

    我猜你正在使用 objective sharpie 工具为 Objective C API 生成 C# 代码。

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

    不管怎样,最简单的解决方法是手动编辑 C# 代码,如果您错过了这个参数,请添加此参数。

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

    如果是这种情况,请在 C# API 中注释 [EventArgs("DidReceiveFrom")] 属性并重新编译绑定。

    【讨论】:

    • 这是 iOS 绑定项目,因此 C# 委托代码将从上面的示例代码生成。没有地方可以编辑委托以使用或不使用发件人作为第一个参数。我只想使用 C# 事件并在 EventArgs 类中包含所有参数,然后发送者应该包含真正的发送者对象而不是第一个事件 args 属性。
    • @awattar 你是写这个 C# 代码还是从 objc 文件生成的?
    • 代码是由 Sharpie 工具生成的,但我添加了 EventArgs 属性,因为我想使用 C# 事件而不是强或弱委托。一切正常,除了绑定库 EventArgs 类生成的委托方法生成的第一个属性丢失。
    • @awattar 如果你写了 EventArgs,你为什么不把 p1 添加到类定义中?
    • 我只在绑定项目中的Sharpie生成的委托方法上写了EventArgs属性。然后绑定项目生成错误的 EventArgs 类,缺少第一个属性。
    【解决方案2】:

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

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

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

    看来,我为其生成绑定的源库中的委托并不严格遵循此规则,第一个参数是字符串形式的半发送者。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-05
      • 1970-01-01
      • 2019-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多