静态 属性 未在 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 一起使用的人一起祈祷。
当我访问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 一起使用的人一起祈祷。