WedX - журнал о программировании и компьютерных науках

Сканер Zbar 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];


}

Смотрите этот снимок экрана:

введите здесь описание изображения

В фоновом режиме сканер все еще работает так дважды.


Ответы:


1

Я столкнулся с той же проблемой. Я добавил переменную экземпляра 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, если вы планируете повторно использовать контроллер представления более одного раза.

01.03.2013
  • Спасибо, но после добавления этого логического флага метод делегата gerbarcodeString: срабатывает только один раз. Но при двукратном запуске метода didFinishPickingMediaInfo: делегата сканирование штрих-кода выполняется в первый раз, но представление сканера не покидает приложение. Пожалуйста, смотрите изображение, добавленное выше. 01.03.2013

  • 2

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

    - (void)imagePickerController:(UIImagePickerController*)reader didFinishPickingMediaWithInfo:(NSDictionary*)info
    {
        // Stop further scanning
        [reader.readerView stop];
        ...
        //Continue with processing barcode data.
    }
    
    02.03.2013
    Новые материалы

    Как проанализировать работу вашего классификатора?
    Не всегда просто знать, какие показатели использовать С развитием глубокого обучения все больше и больше людей учатся обучать свой первый классификатор. Но как только вы закончите..

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

    ИИ в аэрокосмической отрасли
    Каждый полет – это шаг вперед к великой мечте. Чтобы это происходило в их собственном темпе, необходима команда астронавтов для погони за космосом и команда технического обслуживания..


    Для любых предложений по сайту: wedx@cp9.ru