我是目标C新手,所以请原谅错误的术语。
在Xamarin.iOS中,我成功地使用了带有多个静态方法的C#类来实现从Objective-C到C#的回调功能。我想避免创建绑定库(不想使用Sharpie和相关工具/步骤)。我正在为Objective-C寻找一种回调C#中非静态方法的方法。 Objective-C是否可以回调非静态Xamarin.iOS C#方法?我的从目标C到C#的回调技术如下,并在下面进行进一步说明:
- 用C#创建一个包含我的静态回调方法的类。该类继承自NSObject。
- 在Objective-c中创建一个@protocol,它与C#中定义的“回调”类相匹配。
- 实例化C#中的“回调”类,并获取其NSObject.Class.Handle
- 将“回调”类实例的NSObject.Class.Handle从C#传递到Objective-c,
- 在Objective-c中,将句柄转换为一个ID(用于先前定义的@protocol),然后将此ID用作C#类实例(现在在Objective-c中显示为@interface实例)的委托。
使用这种技术,我可以将我的C#“回调”类实例视为Objective-c中的@interface实例。在Objective-c中,我可以将C#类实例中的方法当作@interface实例方法来调用。
在C#中
- 定义一个继承自NSObject的类(NSObject包含Class.Handle定义)
- [注册]类,并[导出]类中的静态回调
- 使用“ NSObject.Class.Handle”获取IntPtr类句柄
- 将类实例句柄(IntPtr)作为'UnmanagedType.iunknown'编入Objective-c
在objective-c中
- 定义一个与C#类相对应的'@protocol'。 @protocol具有与C#类中的每个静态回调方法相对应的实例方法
- 将IntPtr(来自C#)作为“ @协议”的“ id”进行投射
- 将id用作C#类实例(其行为与target-c @interface实例一样)的委托
使用这种技术,我可以将C#类句柄用作Objective-C中的协议ID,并可以将C#类作为Objective-C中的@interface引用。
是否可以使用相同(或类似)方法(将C#中的类句柄传递给Objective-c,并使用该类句柄作为委托)从Objective-C中调用非静态C#方法?
// C# "call-back" class
[Register("AppDelegate")]
public class AppDelegate : NSObject
{
[Export("OnLoginSucceeded:")]
public static void OnLoginSucceeded(string sessionToken)
{
// Do stuff
}
[Export("OnRequestFailed")]
public static void OnRequestFailed()
{
// Do stuff
}
[Export("OnConnectionFailed")]
public static void OnConnectionFailed()
{
// Do stuff
}
public IntPtr GetInstancePointer()
{
IntPtr self = Class.Handle;
return self;
}
}
// objective-c protocol for C# "call-back" class
#import <Foundation/Foundation.h>
@protocol AppDelegate <NSObject>
- (void)OnLoginSucceeded : (NSString*)sessionToken;
- (void)OnRequestFailed;
- (void)OnConnectionFailed;
@end
// objective-c calls to C# callback
[self.appDelegate OnLoginSucceeded : response.sessionToken];
[self.appDelegate OnRequestFailed];
[self.appDelegate OnConnectionFailed];