Способ Связать С Делегатом
Я создаю библиотеку привязки для привязки собственного фреймворка 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.усвн апп.
Обновить
Фреймворк, с которым я имею дело, взаимодействует сустройством чтения карт , подключенным к iPhone для чтения информации о ID-карте, у него есть методы, которые можно вызвать на reader inserted / removed & card inserted / removed..
Я реализовал ответ @cole-xia, но проблема в том, что методы внутри IMMDelegate
никогда не вызываются, когда я вставляю Card reader или ID. Когда я вызываю ReadCardData()
, он должен вызвать Started()
, который будет отображать информацию, сохраненную Inserted()
, но текущий результат состоит в том, что метод Started()
вызывается после вызова ReadCardData()
, но Inserted()
и ReaderConnected()
никогда не вызываются ни на одном этапе.
В демонстрационном приложении фреймворка он используется следующим образом (и работает должным образом):
// 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.
2 ответа:
Использование Шарпи чтобы создать
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 сторонних устройств требует некоторых записей в информации.ключ файла plist
"Supported external accessory protocols"
.Пожалуйста, проверьте образец XCode и проверьте, есть ли запись для ключа
"Supported external accessory protocols"
. Если он есть, то вы должны добавить их в свой Xamarin.информация о проекте iOS.файл plist.Я надеюсь, что это может помочь!