绑定方法与委托
Bind Method With Delegate
我正在创建一个绑定库来绑定本机 Objective-C 框架。
我有以下委托,我需要将它的声明添加到 ApiDefinition 文件,然后我需要使用我的 Xamarin.iOS 应用程序来实现它:
- (void)Initialize:(id <MMSDKDelegate> _Nullable)pDelegate;
MMSDKDelegate:
@protocol MMSDKDelegate <IMMDelegate>
- (void)Started;
@end
IMMDelegate:
@protocol IMMDelegate
- (void)Inserted;
- (void)Removed;
- (void)ReaderConnected;
- (void)ReaderRemoved;
@end
我需要 ApiDefinition 文件中所需的定义,我需要一个示例代码来从我的 Xamarin.iOS 应用程序调用此方法。
更新
我正在处理的框架正在与 iPhone 附带的 card reader device 通信以读取身份证信息,它具有在 reader 插入/移除和卡上调用的方法插入/删除..
我已经实现了@cole-xia 的答案,但问题是当我插入卡 reader 或 ID 时,IMMDelegate
中的方法从未被调用。当我调用ReadCardData()
时,应该会调用Started()
,会显示Inserted()
保存的信息,但现在的结果是调用ReadCardData()
后调用了Started()
方法,但 Inserted()
和 ReaderConnected()
从未在任何阶段被调用。
在Framework的demo app中,是这样使用的(并且可以正常使用):
// Demo app -> ViewController.m
@interface ViewController () <MMSDKDelegate>
@end
@implementation ViewController {
MMSDK *sdkInstance;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
sdkInstance = [MMSDK SharedInstance];
[sdkInstance Initialize:self];
}
- (void)Started
{
// Update UI by: reading in progress ..
}
- (void)Inserted
{
// Update UI by: card inserted
// And read card data
[self readData:self];
}
- (void)Removed
{
// Update UI by: card removed
}
- (void)ReaderConnected
{
// Update UI by: card reader connected
}
- (void)ReaderRemoved
{
// Update UI by: card reader removed
}
- (IBAction)readData:(id)sender
{
var *data = [sdkInstance ReadCardData:YES pWithSignatureImage:YES pWithAddressData:YES];
if (data.hasError) {
// No data fetched
return;
}
if (data) {
// return card data
}
}
欢迎并赞赏所有建议。
总而言之,我只需要在 Xamarin.iOS 应用程序中执行与演示应用程序相同的功能。
使用Sharpie创建ApiDefinition
我这边的结果:
// @protocol IMMDelegate
[BaseType (typeof (NSObject))]
[Protocol, Model]
interface IMMDelegate
{
// @required -(void)Inserted;
[Abstract]
[Export ("Inserted")]
void Inserted ();
// @required -(void)Removed;
[Abstract]
[Export ("Removed")]
void Removed ();
}
// @protocol MMSDKDelegate <IMMDelegate>
[BaseType (typeof (NSObject))]
[Protocol, Model]
interface MMSDKDelegate : IMMDelegate
{
// @required -(void)Started;
[Abstract]
[Export ("Started")]
void Started ();
}
// @interface ACR : NSObject
[BaseType (typeof(NSObject))]
interface YourClass
{
// -(void)Initialize:(id<MMSDKDelegate> _Nullable)pDelegate;
[Export ("Initialize:")]
void Initialize ([NullAllowed] MMSDKDelegate pDelegate);
}
用法:
class MyDelegate : MMSDKDelegate {
public void Started()
{
}
public override void Removed()
{
}
public override void Inserted()
{
}
}
//In ViewController
public override void ViewDidLoad()
{
base.ViewDidLoad();
YourClass yourClass = new YourClass();
yourClass.Initialize(new MyDelegate());
}
除了 Cola Xia 的回答,您可能还需要确保,此类第三方设备 SDK 集成需要 info.plist 文件的 "Supported external accessory protocols"
键中的一些条目。
请检查 XCode 示例并检查是否有 "Supported external accessory protocols"
键的条目。如果存在,则应将它们添加到 Xamarin.iOS 项目的 info.plist 文件中。
希望对您有所帮助!
我正在创建一个绑定库来绑定本机 Objective-C 框架。
我有以下委托,我需要将它的声明添加到 ApiDefinition 文件,然后我需要使用我的 Xamarin.iOS 应用程序来实现它:
- (void)Initialize:(id <MMSDKDelegate> _Nullable)pDelegate;
MMSDKDelegate:
@protocol MMSDKDelegate <IMMDelegate>
- (void)Started;
@end
IMMDelegate:
@protocol IMMDelegate
- (void)Inserted;
- (void)Removed;
- (void)ReaderConnected;
- (void)ReaderRemoved;
@end
我需要 ApiDefinition 文件中所需的定义,我需要一个示例代码来从我的 Xamarin.iOS 应用程序调用此方法。
更新
我正在处理的框架正在与 iPhone 附带的 card reader device 通信以读取身份证信息,它具有在 reader 插入/移除和卡上调用的方法插入/删除..
我已经实现了@cole-xia 的答案,但问题是当我插入卡 reader 或 ID 时,IMMDelegate
中的方法从未被调用。当我调用ReadCardData()
时,应该会调用Started()
,会显示Inserted()
保存的信息,但现在的结果是调用ReadCardData()
后调用了Started()
方法,但 Inserted()
和 ReaderConnected()
从未在任何阶段被调用。
在Framework的demo app中,是这样使用的(并且可以正常使用):
// Demo app -> ViewController.m
@interface ViewController () <MMSDKDelegate>
@end
@implementation ViewController {
MMSDK *sdkInstance;
}
- (void)viewDidAppear:(BOOL)animated
{
[super viewDidAppear:animated];
sdkInstance = [MMSDK SharedInstance];
[sdkInstance Initialize:self];
}
- (void)Started
{
// Update UI by: reading in progress ..
}
- (void)Inserted
{
// Update UI by: card inserted
// And read card data
[self readData:self];
}
- (void)Removed
{
// Update UI by: card removed
}
- (void)ReaderConnected
{
// Update UI by: card reader connected
}
- (void)ReaderRemoved
{
// Update UI by: card reader removed
}
- (IBAction)readData:(id)sender
{
var *data = [sdkInstance ReadCardData:YES pWithSignatureImage:YES pWithAddressData:YES];
if (data.hasError) {
// No data fetched
return;
}
if (data) {
// return card data
}
}
欢迎并赞赏所有建议。
总而言之,我只需要在 Xamarin.iOS 应用程序中执行与演示应用程序相同的功能。
使用Sharpie创建ApiDefinition
我这边的结果:
// @protocol IMMDelegate
[BaseType (typeof (NSObject))]
[Protocol, Model]
interface IMMDelegate
{
// @required -(void)Inserted;
[Abstract]
[Export ("Inserted")]
void Inserted ();
// @required -(void)Removed;
[Abstract]
[Export ("Removed")]
void Removed ();
}
// @protocol MMSDKDelegate <IMMDelegate>
[BaseType (typeof (NSObject))]
[Protocol, Model]
interface MMSDKDelegate : IMMDelegate
{
// @required -(void)Started;
[Abstract]
[Export ("Started")]
void Started ();
}
// @interface ACR : NSObject
[BaseType (typeof(NSObject))]
interface YourClass
{
// -(void)Initialize:(id<MMSDKDelegate> _Nullable)pDelegate;
[Export ("Initialize:")]
void Initialize ([NullAllowed] MMSDKDelegate pDelegate);
}
用法:
class MyDelegate : MMSDKDelegate {
public void Started()
{
}
public override void Removed()
{
}
public override void Inserted()
{
}
}
//In ViewController
public override void ViewDidLoad()
{
base.ViewDidLoad();
YourClass yourClass = new YourClass();
yourClass.Initialize(new MyDelegate());
}
除了 Cola Xia 的回答,您可能还需要确保,此类第三方设备 SDK 集成需要 info.plist 文件的 "Supported external accessory protocols"
键中的一些条目。
请检查 XCode 示例并检查是否有 "Supported external accessory protocols"
键的条目。如果存在,则应将它们添加到 Xamarin.iOS 项目的 info.plist 文件中。
希望对您有所帮助!