2013-06-23 5 views
2

Я использую ZBarSDK (http://zbar.sourceforge.net/iphone/) в своем приложении. Он работает отлично и очень быстро, но я нашел проблему. Я получаю это предупреждение в консоли, а viewerController сканера никогда не увольняется. Это происходит только тогда, когда я пытаюсь отсканировать штрих-код, который я уже сфокусировал. Я имею в виду, когда я нажимаю кнопку, открывающую считыватель viewController, а затем фокусирую камеру, где находится штрих-код, он отлично работает, viewController исчезает, и я получаю код. Но проблема в том, что я уже сосредоточил iPad на штрих-коде, а затем нажимаю кнопку считывателя. Читатель viewController представлен, я получаю код, но viewController не уволен, и я получаю это предупреждение:ZBarSDK не упускает viewController

Предупреждение. Попытайтесь убрать из контроллера просмотра во время презентации или увольнения!

Это код используется:

- (void)escanearCodigo 
{ 
    ZBarReaderViewController *escanearVC = [ZBarReaderViewController new]; 
    escanearVC.readerDelegate = self; 
    escanearVC.supportedOrientationsMask = ZBarOrientationMaskAll; 

    // Presentar pantalla escaneo 
    [self presentViewController:escanearVC animated:YES completion:nil]; 
} 

- (void) imagePickerController: (UIImagePickerController*) reader 
didFinishPickingMediaWithInfo: (NSDictionary*) info 
{ 
    // Obtener el resultado del escaneo 
    id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults]; 
    ZBarSymbol *symbol = nil; 
    for(symbol in results) 
     //Almacenar el codigo de barras 
     break; 

    NSLog(@"Code: %@", symbol.data); 

    [reader dismissViewControllerAnimated:YES completion:nil]; 
} 

Я надеюсь, что я объяснил хорошо :)

Спасибо заранее.

ОБНОВЛЕНО: не До сих пор лучшее «половинное решение» является следующим: Поместите код didFinishPickingMediaWithInfo внутри если предложение, чтобы предотвратить этот код будет Exec, когда ViewController не представлены еще (я думаю) :

- (void) imagePickerController: (UIImagePickerController*) reader 
didFinishPickingMediaWithInfo: (NSDictionary*) info 
{ 
    if (![reader isBeingPresented]) { 
     // Obtener el resultado del escaneo 
     id<NSFastEnumeration> results = [info objectForKey: ZBarReaderControllerResults]; 
     ZBarSymbol *symbol = nil; 
     for(symbol in results) 
      //Almacenar el codigo de barras 
      break; 

     [reader dismissViewControllerAnimated:YES completion:nil]; 

    } 

} 
+0

Вызывается метод 'didFinishPickingMediaWithInfo', когда диспетчер просмотра не увольняется? Вы тестировали его с помощью NSLog? – pmk

+0

спасибо! Я написал файл didFinishPickingMediaWithInfo внутри if (! [Reader isBeingPresented]), и предупреждение исчезнет, ​​но мне нужно сфокусировать другую область (без штрих-кода), а затем сфокусироваться на области штрих-кода, чтобы ее отсканировать. До сих пор это лучшее решение :) Спасибо u! – javiazo

+0

попробуйте очистить кеш ZBarReaderView при представлении ZBarreaderViewcontroller * [escanearVC.readerView flushCache]; * – Bala

ответ

1

... но мне нужно сосредоточиться другой области (без штрих-кода), а затем сосредоточиться на области штрих-кода для сканирования.

Поскольку предупреждение относится к презентации и увольнения вашего ZBarReaderViewController, вы должны инкапсулировать только dismissViewControllerAnimated:completion: вызов в if-другому-блок. Это делается для того, чтобы не повлиять на производительность ZBars, как вы описали. Кроме того, вы можете отложить вызов, если презентация еще не завершилась.

Например:

if (![reader isBeingPresented]) { 
    [self dismissReader]; 
}else{ 
    [self performSelector:@selector(dismissReader) withObject:nil afterDelay:0.7]; 
} 

, а затем в [self dismissReader]:

- (void) dismissReader 
    { 
     [_reader dismissViewControllerAnimated:YES completion:nil]; 
    } 

Примечание: время задержки 0,7 секунды произвольно и может изменяться в зависимости от продолжительности анимации.