底层Swift方法调用时,重写的Xamarin C#方法未触发问题排查
问题原因及解决方案
核心问题1:绑定代码的方法选择器映射错误
你生成的C#绑定代码中,Pingpong方法的Export属性指定了错误的Obj-C选择器:
[Export ("foobar")] void Pingpong ();
原Swift方法pingpong()暴露给Obj-C后的选择器是pingpong,而非foobar。这导致C#的Pingpong方法无法和原方法的选择器关联,所以Swift调用pingpong时,找不到你重写的C#方法。
修复方式:将Export属性改为正确的选择器:
[Export ("pingpong")] void Pingpong ();
核心问题2:Swift方法未启用动态派发
Swift中,仅标记@objc的方法可能被编译器优化为静态派发,绕过Obj-C Runtime,导致Xamarin的子类重写无法被触发。要确保方法通过Obj-C Runtime进行动态派发,需要给Swift方法添加dynamic关键字:
@objc(Foobar) public class Foobar: NSObject { @objc dynamic public func pingpong() { //... } }
额外验证点
确认Swift代码中使用的是C#创建的Fibar实例,而非直接创建Foobar实例。如果Swift侧是let foo = Foobar(),调用的只会是原Foobar的方法;必须让Swift使用你在C#中实例化的Fibar对象,才能触发重写的方法。
内容的提问来源于stack exchange,提问作者XDS
相关产品推荐
相关产品推荐

