2013-03-01 70 views
1

在我的应用程序中,我已经集成了Zbar SDK扫描仪,虽然通常扫描它的工作正常,但我的情况是有些时候didfinishpickingmediawithInfo:委托方法发射两次。这是我的代码,是在一个单独的课。Zbar sdk扫描仪不能正常工作

-(void)scanProductBarCode 
{ 

     ZBarReaderViewController *reader = [ZBarReaderViewController new]; 
     reader.readerDelegate = self; 


     if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) 
      reader.supportedOrientationsMask = ZBarOrientationMaskLandscape; 
     else 
      reader.supportedOrientationsMask = ZBarOrientationMaskPortrait; 

     ZBarImageScanner *scanner = reader.scanner; 
     [scanner setSymbology: ZBAR_UPCA config: ZBAR_CFG_ENABLE to: 1]; 
     [scanner setSymbology: ZBAR_CODE39 config: ZBAR_CFG_ADD_CHECK to: 0]; 


} 

#pragma mark - Scanner delegate methods 

- (void) imagePickerController: (UIImagePickerController*) reader didFinishPickingMediaWithInfo: (NSDictionary*) info 
{ 
    id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults]; 
    ZBarSymbol *symbol = nil; 
    for(symbol in results) 
     break; 

    barCodeString = [[NSString alloc] initWithString:symbol.data]; 

    if(self.delegate) 
     [self.delegate getBarcodeString:barCodeString]; 

    [reader dismissModalViewControllerAnimated:YES]; 


} 

看到这样的画面截图:

enter image description here

在后台扫描仍在运行像这样在两次存在的情况下..

回答

3

我遇到了同样的问题。我在我的类_processing中添加了一个BOOL实例变量。然后我这样做:

- (void)imagePickerController:(UIImagePickerController*)reader didFinishPickingMediaWithInfo:(NSDictionary*)info 
{ 
    if (_processing) return; 

    id<NSFastEnumeration> results = [info objectForKey:ZBarReaderControllerResults]; 
    ZBarSymbol *symbol = nil; 
    for(symbol in results) { 
     _processing = YES; 
     barCodeString = symbol.data; 

     if(self.delegate) { 
      [self.delegate getBarcodeString:barCodeString]; 
     } 

     break; 
    } 

    [reader dismissModalViewControllerAnimated:YES]; 
} 

这确保只处理第一个呼叫。如果您计划重复使用视图控制器,您可能需要重置_processing

+0

谢谢,但加入这个布尔标志后,委托方法gerbarcodeString:在触发一次。但是,在两次触发didFinishPickingMediaInfo:委托方法的情况下,首次完成条形码扫描,并且扫描器视图仍然不会从应用程序中退出。请参阅上面添加的图像。 – Ganapathy 2013-03-01 08:35:47

0

由于ZBarReaderViewController以连续模式扫描图像,因此在关闭ZBarReaderViewController之前可能会扫描图像两次。您可以尝试使读者(ZBarReaderViewController *阅读器)类的一个实例变量,并在委托方法:

- (void)imagePickerController:(UIImagePickerController*)reader didFinishPickingMediaWithInfo:(NSDictionary*)info 
{ 
    // Stop further scanning 
    [reader.readerView stop]; 
    ... 
    //Continue with processing barcode data. 
}