Pacey6
Pacey6
  • 发布:2018-12-19 18:18
  • 更新:2019-04-08 17:40
  • 阅读:1682

native.js在ios中implements实现代理回调报错

分类:Native.js

文件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方法始终无法调用到,有人知道是什么问题么?

2018-12-19 18:18 负责人:无 分享
已邀请:
1***@qq.com

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是怎么写的,还是挺坑的

该问题目前已经被锁定, 无法添加新回复