【问题标题】:How to bind NSObject<EAAccessoryDelegate> in Monotouch?如何在 Monotouch 中绑定 NSObject<EAAccessoryDe​​legate>?
【发布时间】:2013-02-25 15:43:57
【问题描述】:

我有以下Obj-C .h,正确的绑定方式是什么?

@interface iSmart : NSObject<EAAccessoryDelegate>{
  id<iSmartDelegate> delegate;
}

@property(nonatomic, assign) id<iSmartDelegate> delegate;
-(id)init;

@end

__________________________________________________________________________________________

@class iSmart;

@protocol iSmartDelegate <NSObject>

-(void) iSmartDidConnect;
-(void) iSmartDidDisconnect;
-(void) cardStatusChanged:(unsigned char)status;

@end

__________________________________________________________________________________________

此刻我有这个协议和接口:

[BaseType (typeof(NSObject))]
[Model]
interface iSmartDelegate
{
    [Export("iSmartDidConnect")]
    void iSmartDidConnect();

    [Export("iSmartDidDisconnect")]
    void iSmartDidDisconnect();

    [Export("cardStatusChanged:")]
    void CardStatusChanged(Byte status);

}


[BaseType (typeof (EAAccessoryDelegate), 
Delegates=new string [] { "WeakDelegate" },
Events=new Type [] { typeof (iSmartDelegate)})]
interface iSmart
{
    //@property(nonatomic, assign) id<iSmartDelegate> delegate;
    [Export("delegate"), NullAllowed]
    NSObject WeakDelegate { get; set; }

    [Wrap("WeakDelegate")]
    iSmartDelegate Delegate { get; set; }

    //-(id)init;        
    [Export("init")]
    NSObject init();
}

当我尝试在 Xamarin Studio 中构建项目时遇到此错误 错误 BI0000:意外错误 - 请在 http://bugzilla.xamarin.com (BI0000) 提交错误报告

谢谢

【问题讨论】:

  • 绑定 iSmartDelegate 和 EEAccessoryDe​​legate 协议是两个不同的独立问题
  • EAAccessoryDe​​legate 是命名空间 MonoTouch.ExternalAccessory 中的一个类
  • unsigned char 到 char 可能是错误的。将本机无符号字符编组为 .NET 字节,因为 .NET 字符长 2 个字节(以支持 unicode)
  • BI0000 是生成器问题。您可以运行生成器并将详细程度设置为 2 或 3 并报告​​日志吗?

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


【解决方案1】:

协议只是内联在您的 ApiDefinition 中,因此您在 iSmart 定义中实现声明 EAAccessoryDelegate 的几个方法:

[BaseType (typeof(NSObject))]
interface iSmart : EAAccessoryDelegate{
    //bind the protocol here
    [Export ("accessoryDidDisconnect:")]
    void AccessoryDidDisconnect (EAAccessory accessory);
}

要绑定委托,请查看http://docs.xamarin.com/guides/ios/advanced_topics/api_design#Delegates

[UPDATE 2013-02-26] 您的委托绑定看起来不错,除了应该编组为 .NET byte 的本机 unsigned char,因为 .NET char 类型的长度为 2 个字节以适合 Unicode 字符.

[UPDATE 2013-02-27] 另外,正如您最近在您的问题中添加的那样,绑定构造函数的正确方法是这样的(请参阅http://docs.xamarin.com/guides/ios/advanced_topics/binding_objective-c_libraries 中的 3.3):

[Export ("init")]
IntPtr Constructor ();

【讨论】:

    猜你喜欢
    • 2013-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多