Взаимодействие Xamarin.iOS C # с целью-c: обратные вызовы от цель-c к нестатическим методам C # - PullRequest
0 голосов
/ 09 ноября 2019

Я новичок в объективе, поэтому, пожалуйста, простите, что может быть неверной терминологией.

В Xamarin.iOS я успешно использую класс C # с несколькими статическими методами для реализации функциональности обратного вызова из target-С на С #. Я бы хотел избежать создания библиотеки привязки (не хочу использовать Sharpie и связанные с ней инструменты / шаги). Я ищу способ для target-c для обратного вызова нестатических методов в C #. Возможно ли для target-c обратный вызов нестатических методов Xamarin.iOS C #? Моя цель обратного вызова C-C # заключается в следующем и далее описывается ниже:

  • Создайте класс в C #, который содержит мои статические методы обратного вызова. Этот класс наследуется от NSObject.
  • Создайте @protocol в target-c, который соответствует классу «обратного вызова», определенному в C #.
  • Создание экземпляра класса «обратного вызова» в C # и получение его NSObject.Class.Handle
  • Передача NSObject.Class.Handle для экземпляра класса «обратного вызова» из C # в цель-c,
  • В target-c приведите дескриптор к идентификатору (для ранее определенного @protocol) и используйте этот идентификатор в качестве делегата для экземпляра класса C # (который теперь отображается как экземпляр @interface вцель-с).

Используя эту технику, я могу обрабатывать мой экземпляр класса "обратного вызова" в C # как экземпляр @interface в target-c. В target-c я могу вызывать методы в своем экземпляре класса C #, обрабатывая их как методы экземпляра @interface.

В C #

  • Определить класс, которыйнаследуется от NSObject (NSObject включает определение Class.Handle)
  • [Зарегистрируйте] класс и [Export] статические обратные вызовы внутри класса
  • Используйте 'NSObject.Class.Handle', чтобы получить класс IntPtrhandle
  • Маршал дескриптора экземпляра класса (IntPtr) для объектива-c как 'UnmanagedType.IUnknown'

В объективе-c

  • определить '@protocol', который соответствует классу C #. В @protocol есть методы экземпляра, которые соответствуют каждому статическому методу обратного вызова в классе C #
  • приведение IntPtr (из C #) в качестве 'id' для '@ protocol'
  • с использованием idкак делегат экземпляра класса C # (который ведет себя как экземпляр target-c @interface)

Используя эту технику, я могу использовать дескриптор класса C # в качестве идентификатора протокола в target-c и в качестве ссылкикласс C # как @interface в target-c.

Может ли этот же (или аналогичный) метод (передавать дескриптор класса из C # в target-c и использовать этот дескриптор класса в качестве делегата) использоваться для вызованестатические методы C # из target-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];

1 Ответ

0 голосов
/ 11 ноября 2019

Возможно ли для target-c обратный вызов нестатических методов Xamarin.iOS C #?

Не слишком много понимания нестатический , как бы язнать, что при привязке пользовательских элементов управления , свойства привязки должны быть статическими .

  • свойства привязки должны быть статическими - при определении привязкисвойств, атрибут [Static] должен использоваться.
...