You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MAUI绑定iOS委托类时实例化失败,寻求解决方法

解决iOS框架绑定MAUI时委托实例化错误的思路

核心问题分析

你遇到的错误根源是对C#继承规则的误解:原生协议WYSSignatureProcessDelegate继承了NSObjectProtocol,要求遵循该协议的类必须是NSObject子类。C#中继承NSObject类 + 实现协议接口属于单继承+多接口实现,完全符合语法规范,并非你以为的“多继承”。直接继承绑定生成的协议接口会导致原生侧无法识别实例,从而抛出类未加载的错误。

具体解决方案

1. 保留Sharpie生成的绑定代码

绑定代码无需修改,它已正确映射原生协议:

// @protocol WYSSignatureProcessDelegate <NSObject>
[Protocol]
[BaseType (typeof(NSObject))]
interface WYSSignatureProcessDelegate
{
    // @required -(void)documentPreparedForSignature:(NSData * _Nonnull)documentDigest withReason:(NSString * _Nonnull)reason;
    [Abstract]
    [Export ("documentPreparedForSignature:withReason:")]
    void DocumentPreparedForSignature (NSData documentDigest, string reason);
}

2. 修正C#委托实现类

改为继承NSObject并实现协议接口,同时保留[Export]属性让原生识别协议方法:

private class SignatureProcessDelegate : NSObject, WYSSignatureProcessDelegate
{
    public event EventHandler<IDocumentPreparedEventArgs> DocumentPreparedEventHandler;

    [Export("documentPreparedForSignature:withReason:")]
    public void DocumentPreparedForSignature(NSData documentDigest, string reason)
    {
        // 将NSData转换为Stream供上层业务逻辑使用
        using var stream = documentDigest.AsStream();
        DocumentPreparedEventHandler?.Invoke(this, new DocumentPreparedEventArgs(stream, reason));
    }
}

3. 关键注意事项

  • 必须继承NSObject:满足原生协议对NSObjectProtocol的依赖,确保原生侧能正确识别实例类型
  • 严格匹配[Export]签名:方法签名必须和绑定代码完全一致,否则原生无法检测到协议方法的实现
  • 处理参数类型转换:绑定代码中定义的是NSData,实现类需先接收原生类型再转换为Stream,避免类型不匹配导致绑定失败

内容的提问来源于stack exchange,提问作者Maxime Esprit

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 09:15:27