【问题标题】:Static property not instantiated in class from binding静态属性未通过绑定在类中实例化
【发布时间】: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


【解决方案1】:

我不确定您的确切问题是什么(可能是链接不正确,可能是 plist 设置不正确等),但我已经使用最新的 SDK(v3.7.2 as写作)。步骤如下:

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

sharpie bind --output=. --namespace=WisePad2Binding --sdk=iphoneos13.2 --scope=&lt;path-to-sdk&gt;/BBDevice-iOS-SDK-3.7.2/Library &lt;path-to-sdk&gt;/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 ("&lt;library-name&gt;.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 一起使用的人表达我的想法和祈祷。

【讨论】:

    【解决方案2】:

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

    所以您的 sharedController 方法应该分配您的 BBDeviceController 或在某个地方获取它。另外,如果您可以共享库链接,那么我们就在同一页面上。

    【讨论】:

    • 不幸的是,您必须通过身份验证才能查看文档。这是给BBPOS的,但你必须有一个帐户才能查看任何内容。
    猜你喜欢
    • 2013-08-25
    • 2021-08-26
    • 1970-01-01
    • 2014-09-10
    • 2021-03-05
    • 2016-04-06
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多