Я новичок в объективе, поэтому, пожалуйста, простите, что может быть неверной терминологией.
В 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];