Xamarin.iOS C#与Objective-C的互操作性:从Objective-C到非静态C#方法的回调

问题描述 投票:0回答:1

我是一名目标C新手,所以请原谅不正确的术语。

在Xamarin.iOS中,我成功地使用了带有多个静态方法的C#类来实现从Objective-C到C#的回调功能。我想避免创建绑定库(不想使用Sharpie和相关工具/步骤)。我正在为Objective-C寻找一种回调C#中非静态方法的方法。 Objective-C是否可以回调非静态Xamarin.iOS C#方法?我的Objective-c至C#的回调技术如下,并在下面进行进一步说明:

  • 用C#创建一个包含我的静态回调方法的类。此类从NSObject继承。
  • 在Objective-C中创建一个@protocol,它与C#中定义的“回调”类相匹配。
  • 实例化C#中的“回调”类并获取其NSObject.Class.Handle
  • 将“回调”类实例的NSObject.Class.Handle从C#传递到Objective-c,
  • 在Objective-c中,将句柄转换为一个ID(对于先前定义的@protocol),并使用该ID作为C#类实例(现在在Objective-c中显示为@interface实例)的委托。

使用该技术,我可以将我的C#“回调”类实例视为Objective-c中的@interface实例。在Objective-c中,我可以将C#类实例中的方法视为@interface实例方法来调用它们。

在C#中>>

  • 定义一个从NSObject继承的类(NSObject包括Class.Handle定义)
  • [注册]类,并[导出]类中的静态回调
  • 使用'NSObject.Class.Handle'获得IntPtr类句柄
  • 将类实例句柄(IntPtr)编组为Objective-c的'UnmanagedType.IUnknown'
  • Objective-c

  • 定义与C#类相对应的'@protocol'。 @protocol具有对应于C#类中每个静态回调方法的实例方法。
  • 将IntPtr(从C#中投射为'@protocol'的'id']
  • 将ID用作C#类实例的代理(它充当目标C @interface实例)
  • 使用此技术,我可以将C#类句柄用作Objective-C中的协议ID,并引用C#类作为Objective-C中的@interface。

    是否可以使用相同(或相似)方法(将类句柄从C#传递到Objective-c,并使用该类句柄作为委托)从Objective-c调用非静态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];

我是一位目标C新手,所以请原谅不正确的术语。在Xamarin.iOS中,我成功地使用具有多个静态方法的C#类来实现回调功能...

objective-c callback xamarin.ios language-interoperability
1个回答
0
投票

objective-c是否可以回调到非静态Xamarin.iOS C#方法?

© www.soinside.com 2019 - 2024. All rights reserved.