文件XCPrintService.h
//此处省略...
@protocol XCStateListener <NSObject>
@required
- (void)onSuccess;
@end
@interface XCPrintService : NSObject<CBCentralManagerDelegate,CBPeripheralDelegate>
//此处省略...
@property (nonatomic) id<XCStateListener> stateListener;
@end
文件XCPrintService.m
@implementation XCPrintService
- (void)setStateListener:(id<XCStateListener>)listener
{
_stateListener = listener;
}
// 状态更新时调用
- (void)centralManagerDidUpdateState:(CBCentralManager *)central
{
switch (central.state) {
//此处省略...
case CBManagerStatePoweredOn:
{
[_stateListener onSuccess];
NSLog(@"开启状态-可用状态");
}
break;
default:
break;
}
}
//此处省略...
nativejs调用代码
var XCPrintService = plus.ios.importClass("XCPrintService");
var stateListener = plus.ios.implements("XCStateListener", {
"onSuccess":function() {
console.log("蓝牙成功");
}
});
XCPrintService.getInstance().setStateListener(stateListener);
XCPrintService.getInstance().initialize();
我先调用传入了stateListener,日志显示设置方法有调用到,然后初始化方法initialize()包含了获取蓝牙状态,蓝牙状态会回调centralManagerDidUpdateState方法,已经确定蓝牙开启且该方法已回调,问题出在代码:[_stateListener onSuccess];报错:
PProtrol_Bridge -- E -- *** -[__NSPlaceholderDictionary initWithObjects:forKeys:count:]: attempt to insert nil object from objects[1]
nativej里的onSuccess方法始终无法调用到,有人知道是什么问题么?
1 个回复
1***@qq.com
这是一个相当奇葩的问题,我也报了同样的错,完全搜不到类似的答案(所有我还是在这写一下我的),经过多次尝试后发现,我的类里面有一个NSString的属性outString,这个outString的作用是nativejs通过plusGetAttribute获取对象属性,然后原生这边是先给outString赋值然后调用delegate回调到njs那边去,我通过变量赋值给outString或者直接赋值@"***"都会报那种错,必须通过[NSString stringWithFormat:@"%@",]这种初始化的方式赋值才行。所有上面这个问题里面需要注意XCPrintService这个类里面的属性的赋值。
其实我最终发现解决办法之前有一些尝试,比如,njs触发原生的方法是nativeActive,我在nativeActive方法里面直接写
if (self.delegate && [self.delegate respondsToSelector:@selector(onEventInvoked:)]) {
self.outString = @"字符串";
[self.delegate onEventInvoked:@""];
}
这样写不报错。但是我把回调代理的方法提取到独立的方法里面
(void)backToNjs:(NSString *)string {
if (self.delegate && [self.delegate respondsToSelector:@selector(onEventInvoked:)]) {
NSLog(@"ZQWebAppPlugin: 图片上传后的URL返回给web");
self.outString = @"这个地方跟上面一样也是直接赋值一个字符串";
[self.delegate onEventInvoked:@""];
}
}
然后在nativeActive方法里面调用[self backToNjs:@""]方法就不行,就会报楼主上面那个错,这两种写法我也不知道区别在哪里,同样都是在njs触发原生后立刻通过delegate回调。也不知道SDK内部在获取原生的类、实现原生的delegate是怎么写的,还是挺坑的