静态 属性 未在 class 中通过绑定实例化

Static property not instantiated in class from binding

当我访问static 属性 SharedController时,值为null,但是Objective Sharpie生成的API Definition只提供了一个getter。

BBDeviceController被实例化了,但是上面的SharedController属性是null。因为它只有一个 getter,我不相信我能够在代码中实例化 属性。据我所知,SharedController 没有在 BBDeviceController 的构造函数中初始化。我不确定 BBDeviceController 是静态的 class 还是仅遵循单例设计模式,但无论哪种方式,更新 class 都不是解决方案。

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);
}

根据 objective C 库的文档,您可以这样使用 sharedController

[[BBDeviceController sharedController] setDelegate:self];

尝试执行 C# 等效操作时,出现错误,因为 SharedController 为空。 其他可能感兴趣的是,生成的 API 定义文件中的 SharedController 定义被标记为 [Verify(MethodToProperty)],我必须手动添加 [Static] 才能访问它来自代码。

当我做这样的事情时,它是针对单身人士的class。 https://www.galloway.me.uk/tutorials/singleton-classes/

所以您的 sharedController 方法应该分配您的 BBDeviceController 或将其获取到某个地方。此外,如果您可以共享库 link,那么我们就在同一页上了。

我不确定您的具体问题是什么(可能是链接不正确,也可能是 plist 设置不正确等),但我已经使用最新的 SDK (v3.1) 成功解决了这个问题。 7.2 撰写之时)。以下是步骤:

1。使用以下 sharpie 命令进行绑定:

sharpie bind --output=. --namespace=WisePad2Binding --sdk=iphoneos13.2 --scope=<path-to-sdk>/BBDevice-iOS-SDK-3.7.2/Library <path-to-sdk>/BBDevice-iOS-SDK-3.7.2/Library/BBDeviceController.h

2。删除 [Verify] 标签

我继续将所有更改为由 [Verify] 标记的属性的方法改回,只是为了减少机会。

3。将库添加到您的绑定项目

在绑定产品中,我没有使用“Native References”文件夹(好吧,我最初尝试过但没有用)。显然,制作绑定项目的“旧”方法是将库拖到项目根目录中。执行此操作时,每个库都会附加一个 .linkwith.cs(稍后会详细介绍)。我添加的库是:

  • libBBDevice-iOS-AudioAndBT-3.7.2.a
  • libBBDevice-iOS-AudioAndBT-3.7.2-simulator.a
  • libBBDeviceOTA-iOS-1.5.4.a
  • libBBDeviceOTA-iOS-1.5.4-simulator.a

然后在每个 .linkwith.cs 文件中将程序集属性更改为...

[assembly: LinkWith ("<library-name>.a", SmartLink = true, ForceLoad = true, Frameworks = "AudioToolbox AVFoundation CoreAudio CoreBluetooth CoreGraphics CoreFoundation CoreLocation ExternalAccessory Foundation MediaPlayer MessageUI QuartzCore SystemConfiguration UIKit", LinkerFlags = "-lc++ -lz -ObjC")]

4。更新你的 plist

确保您已将他们列出的所有内容 here 添加到您的 plist 中,否则这些内容将无法正常工作。

5。提示

如果我不在主线程上执行某些(全部?)操作,我将无法正常工作,所以我只在主线程上执行所有操作。另外,不要在不调用 BBDeviceController.SharedController.ReleaseBBDeviceController() 的情况下在共享控制器上设置委托(如果您之前在那里设置了委托)。我的想法和祈祷与其他任何试图将此 SDK 与 Xamarin 一起使用的人一起祈祷。