Xamarin.iOS绑定:在Event args中缺少第一个参数

时间:2015-03-13 11:33:30

标签: c# ios objective-c xamarin.ios

我正在尝试为现有的iOS SDK创建Xamarin.iOS绑定。我使用ObjectiveC-Sharpie创建ApiDefinition.cs并在Xamarin绑定项目中使用它来创建dll文件。该库按预期工作,我能够使用示例应用程序测试该DLL。

下一步,我试图将Objective-C代表更改为C#事件。我遵循了Xamarin文档和其他类似性质的项目。但是,生成的事件始终缺少原始方法的第一个参数。

最初的Objective-C协议方法是:

- (void)foundDevice:(Device*)device amongstAvailableDevices:(NSDictionary*)dictionary;

这是我做的:

  1. 这就是ApiDefinition.cs的样子:

    [BaseType (typeof (NSObject), Name="MyClass", Delegates=new string [] {"Delegate"}, Events = new Type [] { typeof (MyClassDelegate) })]
    interface MyClass
    {
        [Export ("delegate", ArgumentSemantic.Weak)]
        [NullAllowed]
        NSObject WeakDelegate { get; set; }
    
        [Wrap ("WeakDelegate")]
        MyClassDelegate Delegate { get; set; }
    
        [Static, Export ("sharedInstance")]
        MyClass SharedInstance();
    }
    
    
    [Protocol,Model]
    [BaseType (typeof (NSObject))]
    interface MyClassDelegate
    {
       ...
       [Export ("foundDevice:amongstAvailableDevices:"), EventArgs("MyClassFoundDevice")]
        void FoundDevice(Device device, NSDictionary deviceDictionary);
       ...
    }
    
  2. 项目已完成,我在Sample项目中导入了dll文件。上述代表的事件正在生成:

    MyClass finder = new MyClass();
    finder.FoundDevice += (object sender, MyClassFoundDeviceEventArgs e) => {
         Console.WriteLine ("Found device " + e.DeviceDictionary.ToString());
    }; 
    
  3. 但是,我无法访问委托方法的第一个参数(在本例中为设备设备)。就像在,如果我尝试访问e.device,它会给出编译错误 - 甚至没有出现在自动完成建议中。这种情况发生在所有委托方法中:第一个参数无法从eventArgs访问。 MyClassFoundDeviceEventArgs类看起来像:

     public class MyClassFoundDeviceEventArgs : EventArgs
     {
            //
            // Properties
            //
            public NSDictionary DeviceDictionary {
                [CompilerGenerated]
                get;
                [CompilerGenerated]
                set;
            }
    
            //
            // Constructors
            //
            public MyClassFoundDeviceEventArgs (NSDictionary deviceDictionary);
      }
    

    我尝试在ApiDefinition中为托管方法声明添加一个虚拟的第一个参数:

    void FoundDevice(MyClass this, Device device, NSDictionary deviceDictionary);
    

    我能够访问"设备设备"从eventargs但项目编译失败,给出错误:

    错误MT4117:注册商在方法中发现签名不匹配 - 选择器foundDevice:amongAvailableDevices:表示方法有2个参数,而托管方法FoundDevice有3个参数。 (MT4117)。

0 个答案:

没有答案