【发布时间】:2019-08-19 15:52:48
【问题描述】:
当我访问静态属性SharedController时,值为null,但Objective Sharpie生成的API定义只提供了一个getter。
BBDeviceController 已实例化,但其上的SharedController 属性为空。因为它只有一个 getter,所以我不相信我能够在代码中实例化该属性。据我所知,SharedController 没有在BBDeviceController 的构造函数中初始化。我不确定BBDeviceController 是静态类还是只是遵循单例设计模式,但无论哪种方式,更新该类都不是解决方案。
BBDeviceController.h
@interface BBDeviceController : NSObject {
NSObject <BBDeviceControllerDelegate>* delegate;
BOOL debugLogEnabled;
BOOL detectAudioDevicePlugged;
}
@property (nonatomic, weak) NSObject <BBDeviceControllerDelegate>* delegate;
@property (nonatomic, getter=isDebugLogEnabled, setter=setDebugLogEnabled:) BOOL debugLogEnabled;
@property (nonatomic, getter=isDetectAudioDevicePlugged, setter=setDetectAudioDevicePlugged:) BOOL detectAudioDevicePlugged;
+ (BBDeviceController *)sharedController;
生成的 API 定义 (APIDefinition.cs)
[BaseType(typeof(NSObject))]
[Protocol]
interface BBDeviceController
{
...
// +(BBDeviceController *)sharedController;
[Static]
[Export("sharedController")]
BBDeviceController SharedController { get; }
...
}
从项目的视图控制器调用
public BBDeviceController bbDeviceController;
public override void ViewDidLoad()
{
base.ViewDidLoad();
bbDeviceController = BBDeviceController.SharedController;
ConnectDevice();
}
private void ConnectDevice()
{
bbDeviceController.StartBTScan(new string[] { DEVICE_NAME }, 60);
}
从目标 C 库的文档中,您可以像这样使用 sharedController:
[[BBDeviceController sharedController] setDelegate:self];
尝试执行 C# 等效项时,我收到一个错误,因为 SharedController 为空。
其他可能感兴趣的是,生成的 API 定义文件中的 SharedController 定义被标记为 [Verify(MethodToProperty)],我必须手动添加 [Static] 才能从代码中访问它。
【问题讨论】:
-
+ (BBDeviceController *)sharedController;这是一个类方法,无法从中获取实例。 -
@JuniorJiang-MSFT 我该如何解决这个问题?我是否更改了 APIDefinition.cs 中的某些内容,还是原来的库有问题?
标签: c# objective-c xamarin objective-sharpie