从iOS cordova中的委托方法发送pluginResult

时间:2014-01-24 00:30:19

标签: ios objective-c mobile plugins cordova

我有一个似乎尚未回答的问题。我是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

2 个答案:

答案 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. 显示微调器或占位符文本(“检索数据”)
  2. 致电插件
  3. 在回调中:

    1. 删除微调器/占位符。
    2. 显示结果。

答案 1 :(得分:0)

我发现了这个问题,它与UIImagePickerController的范围有关。当委托方法运行时,此对象是唯一仍在范围内的对象。我错误地将回调ID保存为类属性,我想我可以在调用imagePickerController:didFinishPickingMediaWithInfo:方法时检索它。

修复只是为了扩展ZBAR reader类并添加一个属性,以便我可以存储回调ID。所有Cordova插件都需要正确的回调ID才能返回JS端属性。