Способ Связать С Делегатом


Я создаю библиотеку привязки для привязки собственного фреймворка 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 5

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.

Я надеюсь, что это может помочь!