我有一个似乎尚未回答的问题。我是Cordova的新手,所以我不确定这是否是框架中的调用。我有一个插件,它使用Zbar libaray扫描条形码。扫描的结果由委托管理,并在方法imagePickerController中返回:didFinishPickingMediaWithInfo :.我的插件调用扫描方法,但在扫描方法结束后返回。我需要它将日期返回到我要求它的网站。我需要知道如何在发送响应我的webview之前让我的扫描方法等待我的zbar委托完成。如果你能为我解决这个问题,请提前感谢你。没有调用[super writeJavascript:jsCallback]不起作用,我使用的是cordova而不是phonegap。
#import "Camera.h"
#import <Cordova/CDV.h>
#import "AppDelegate.h"
@implementation Camera
@synthesize resultStr, command, hasPendingOperation;
//Override
- (void)pluginInitialize
{
NSLog(@"%@", @"init Camera");
}
- (void)scan:(CDVInvokedUrlCommand*)mycommand{
NSLog(@"%@", @"Camera.scan");
self.command = mycommand;
ZBarReaderViewController *reader = [ZBarReaderViewController new];
reader.readerDelegate = self;
reader.supportedOrientationsMask = ZBarOrientationMaskAll;
ZBarImageScanner *scanner = reader.scanner;
// TODO: (optional) additional reader configuration here
// EXAMPLE: disable rarely used I2/5 to improve performance
[scanner setSymbology: ZBAR_I25
config: ZBAR_CFG_ENABLE
to: 0];
// present and release the controller
[self.viewController presentViewController:reader animated:YES completion:nil];
NSLog(@"%@", @"finsihed plugin");
}
- (void) imagePickerController: (UIImagePickerController*) reader
didFinishPickingMediaWithInfo: (NSDictionary*) info
{
// ADD: get the decode results
id<NSFastEnumeration> results =
[info objectForKey: ZBarReaderControllerResults];
ZBarSymbol *symbol = nil;
for(symbol in results)
// EXAMPLE: just grab the first barcode
break;
self.resultStr = symbol.data;
// ADD: dismiss the controller (NB dismiss from the *reader*!)
[reader dismissViewControllerAnimated:YES completion:nil];
CDVPluginResult* pluginResult = nil;
if (self.resultStr != nil && [self.resultStr length] > 0) {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_OK messageAsString:self.resultStr];
} else {
pluginResult = [CDVPluginResult resultWithStatus:CDVCommandStatus_ERROR messageAsString:@"Failed to scan barcode!"];
}
NSLog(@"%@", self.resultStr); //<----- this is the date I need to return to my //webview this issue is scan: has already completed and returned
[self.commandDelegate sendPluginResult:pluginResult callbackId:command.callbackId];
}
@end
答案 0 :(得分:0)
当您从javascript调用插件时,您会提供成功和失败的回调。此回调是插件将值传递回Web层的唯一方法。
具体来说,你的javascript看起来像这样。
cordova.exec(
function (result) {
// do stuff with plugin result! Hurray!
},
function (error) {
self.alert("Things went downhill, sorry... :\r\r" + error);
},
"PluginName", "MethodName", [parameters]
);
由于插件结果已经通过回调传递,因此从委托提供的事实应该是无关紧要的。
<强>更新强>
您的问题询问是否在Objective-C方面等待。 不要等待。这不是科尔多瓦的设计方式,如果你没有立即从电话中回来,你甚至会在控制台中看到警告。
Cordova插件调用旨在调用异步回调,您必须围绕这些调用设计Web界面。
常见的方法是在执行调用时显示微调器或占位符文本
在回调中:
答案 1 :(得分:0)
我发现了这个问题,它与UIImagePickerController
的范围有关。当委托方法运行时,此对象是唯一仍在范围内的对象。我错误地将回调ID保存为类属性,我想我可以在调用imagePickerController:didFinishPickingMediaWithInfo:
方法时检索它。
修复只是为了扩展ZBAR reader类并添加一个属性,以便我可以存储回调ID。所有Cordova插件都需要正确的回调ID才能返回JS端属性。