2013-03-01 2 views
1

내 응용 프로그램에서 Zbar SDK 스캐너를 통합했습니다. 일반적으로 잘 작동하지만 내 경우에는 didfinishpickingmediawithInfo : delegate method firing을 두 번 사용합니다. 여기 singletone 클래스에있는 코드가 있습니다.Zbar sdk 스캐너가 제대로 작동하지 않습니다.

enter image description here

배경에서 스캐너가 여전히 두 번 발생하는 경우 다음과 같이 실행 ..

답변

3

저도 같은 문제로 실행 :

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


} 

이 스크린 샷을 참조하십시오. _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 : delegate 메소드의 두 번 발생시, 바코드 스캐닝이 처음 수행되고 스캐너 뷰가 애플리케이션에서 사임되지 않습니다. 위의 이미지를 참조하십시오. – Ganapathy

0

ZBarReaderViewController는 이미지를 연속 모드로 스캔하기 때문에 ZBarReaderViewController를 닫기 전에 이미지가 두 번 스캔 될 수 있습니다. 당신은 독자 (ZBarReaderViewController * 독자) 클래스의 인스턴스 변수를 만드는 시도하고 위임 방법의 수

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