2

アプリでZBarSDK ( http://zbar.sourceforge.net/iphone/ ) を使用しています。正常に動作し、非常に高速ですが、問題が見つかりました。コンソールでこの警告が表示され、スキャナーのviewControllerは決して閉じません。既に焦点を合わせたバーコードをスキャンしようとしたときにのみ発生します。つまり、リーダーviewControllerを開くボタンを押してから、バーコードがある場所にカメラをフォーカスすると、正常に機能し、viewControllerが消えてコードが取得されます。しかし、問題は、iPad の焦点をバーコードに合わせてからリーダー ボタンを押した場合です。リーダーviewControllerが表示され、コードを取得しますが、viewControllerは閉じられず、次の警告が表示されます:

警告: プレゼンテーションまたは却下の進行中に、View Controller から却下しようとしています!

これは使用されるコードです:

- (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 コードを if 文の中に入れて、viewController がまだ表示されていないときにこのコードが exec になるのを防ぎます (私は思います):

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

    }

}
4

1 に答える 1

1

...しかし、別の領域 (バーコードなし) に焦点を合わせてから、バーコード領域に焦点を合わせてスキャンする必要があります。

警告は ZBarReaderViewController の提示と却下に関連しているためdismissViewControllerAnimated:completion:、if-else-block でのみ呼び出しをカプセル化する必要があります。これは、説明したように 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 秒の遅延時間は任意であり、アニメーションの長さによって異なる場合があります。

于 2013-10-19T18:47:33.120 に答える