• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

c# - 没有参数的iOS委托(delegate)方法难以绑定(bind)

[复制链接]
菜鸟教程小白 发表于 2022-12-12 15:08:34 | 显示全部楼层 |阅读模式 打印 上一主题 下一主题

为 Xamarin 绑定(bind) iOS lib.a 时,出现以下错误:

btouch: The delegate method Device.SomeDeviceDelegate.CaptureComplete needs to take at least one parameter (BI1003)

绑定(bind)已生成Objective Sharpie .



注意。我已将名称更改为 SomeDevice 以隐藏硬件/设备名称 (NDA)。

编译器提示 //@optional -(void)CaptureComplete; 和相应的绑定(bind) CaptureComplete() 没有参数,并且至少需要一个参数。

问:我需要做什么来绑定(bind)这个委托(delegate)?

我试过 Binding Types Reference Guide并尝试应用

  • EventArgs 属性
  • NoDefaultValue 属性
  • DefaultValueFromArgument 属性

更新

我误解了 NoDefaultValueDefaultValueFromArgument 属性,它们在委托(delegate)返回值(例如 bool)时使用,因为返回会干扰事件的 Xamarin 包装。



Best Answer-推荐答案


我找到了解决办法。

注意:这次我没有更改名称,因为它使答案不太清楚。

处理 ObjC 委托(delegate)的首选方式是将它们公开为事件,例如

// @interface ICBarCodeReader : ICISMPDevice
[DisableDefaultCtor]
[BaseType(typeof(ICISMPDevice), Delegates = new[] { "WeakDelegate" }, Events = new[] { typeof(ICBarCodeReaderDelegate) }))]
public interface ICBarCodeReader
{
    [Wrap("WeakDelegate")]
    ICBarCodeReaderDelegate Delegate { get; set; }

    // @property (assign, nonatomic) id<ICISMPDeviceDelegate,ICBarCodeReaderDelegate> delegate;
    [NullAllowed, Export("delegate", ArgumentSemantic.Assign)]
    ICBarCodeReaderDelegate WeakDelegate { get; set; }
}

BaseType 的 Delegate 和 Events 参数,生成包装 ICBarCodeReaderDelegate 上的每个方法的代码。

// @protocol ICBarCodeReaderDelegate
[Protocol, Model, Preserve]
[BaseType(typeof(ICISMPDeviceDelegate))]
public interface ICBarCodeReaderDelegate
{
    // @required -(void)barcodeDataid)data ofTypeint)type;
    [Abstract]
    [Export("barcodeDatafType:")]
    [EventArgs("BarcodeData")]
    void BarcodeData(string data, BarCodeSymbologies type);

    // @required -(void)configurationRequest;
    [Abstract]
    [Export("configurationRequest")]
    void ConfigurationRequest();
}

这允许你在你的项目中做:

public void Init()
{
    _sharedBarCodeReader.BarcodeData += OnBarcodeData;
}

private void OnBarcodeData(object sender, BarcodeDataEventArgs e)
{
    var barcode = Convert.ToString(sender); // this maps to string data
    //BarCodeSymbologies is in BarcodeDataEventArgs

    var handler = BarCodeData;
    if (handler != null)
        handler(this, barcode);
}

但是,当方法没有参数时,这种方法会失败,如 btouch 错误消息所示。

我发现的另一种方法(现在看起来简单明了)不是将委托(delegate)包装为事件,例如

// @interface ICBarCodeReader : ICISMPDevice
[DisableDefaultCtor]
[BaseType(typeof(ICISMPDevice))]
public interface ICBarCodeReader
{
    [Wrap("WeakDelegate")]
    ICBarCodeReaderDelegate Delegate { get; set; }

    // @property (assign, nonatomic) id<ICISMPDeviceDelegate,ICBarCodeReaderDelegate> delegate;
    [NullAllowed, Export("delegate", ArgumentSemantic.Assign)]
    ICBarCodeReaderDelegate WeakDelegate { get; set; }
}

并改为创建 Delegate 接口(interface)的实现。

例如

public void Init()
{
    _sharedBarCodeReader.Delegate = new BarCodeReaderDelegate(this);
}

private class BarCodeReaderDelegate : ICBarCodeReaderDelegate
{
    public BarCodeReaderDelegate(BarCodeScanner barCodeScanner)
    {
        _barCodeScanner = barCodeScanner;
    }

    public override void BarcodeData(string data, BarCodeSymbologies type)
    {
        var handler = _barCodeScanner.BarCodeData;
        if (handler != null)
            handler(this, data);
    }

    public override void ConfigurationRequest() { }

    private readonly BarCodeScanner _barCodeScanner;
}

关于c# - 没有参数的iOS委托(delegate)方法难以绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29909810/

回复

使用道具 举报

懒得打字嘛,点击右侧快捷回复 【右侧内容,后台自定义】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关注0

粉丝2

帖子830918

发布主题
阅读排行 更多
广告位

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap