2013-03-01 2 views
1

В моем приложении у меня встроенный сканер SDbar SDK, в то время как сканирование обычно работает нормально, но мой случай несколько раз делал финишированиемедикой.Информация: метод делегата срабатывает дважды. Вот мой код, который находится в одном классе.Сканер 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

я столкнулся с той же проблемой. Я добавил переменную экземпляра BOOL в мой класс с именем _processing. Затем я сделал следующее:

- (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

Спасибо, но после добавления этого флага BOOL, метод делегата gerbarcodeString: стреляют только один раз. Но при повторном запуске дела метода didFinishPickingMediaInfo: делегировать, при первом сканировании штрих-кода выполняется и все же просмотр сканера не сбрасывается с приложения. См. Изображение, добавленное выше. – Ganapathy

0

Поскольку ZBarReaderViewController сканирует изображение в непрерывном режиме, может случиться так, что изображение сканируется дважды, прежде чем вы упустите ZBarReaderViewController. Вы можете попробовать сделать читатель (ZBarReaderViewController * читатель) переменным экземпляр вашего класса, и в методе делегата:

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