2

QR コードのスキャンに iOS zxing ウィジェットを使用しようとしています。UINavigationController でアイテムとしてプッシュされるか、別の ViewController からモーダルに提示される ViewController があります。この ViewController には、3 つの異なるビューの SegmentedControl があります。これらのビューのうちの 2 つは、単純な Web サイトをロードする UIWebView であり、特別なことは何もありません。

選択は次のようになります。

- (IBAction)segmentedControlValueChanged:(id)sender {
    NSString *urlString;
    ZXingWidgetController *widController;
    QRCodeReader* qrcodeReader;
    NSSet *readers;
    switch (segmentedControl.selectedSegmentIndex) {
        case 0:
            [self.view bringSubviewToFront:self.productSearchWebView];
            urlString = [[SACommunicationService sharedCommunicationService] getURLforKey:kURLTypeProductSearch];
            [self.productSearchWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];
            break;
        case 1:
            [self.view bringSubviewToFront:self.marketSearchWebView];
            urlString = [[SACommunicationService sharedCommunicationService] getURLforKey:kURLTypeMarketSearch];
            [self.marketSearchWebView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:urlString]]];
            break;
        case 2:
            widController = [[ZXingWidgetController alloc] initWithDelegate:self showCancel:YES OneDMode:NO];
            qrcodeReader = [[QRCodeReader alloc] init];
            readers = [[NSSet alloc] initWithObjects:qrcodeReader,nil];
            widController.readers = readers;
            [self.QRCodeScannerView addSubview:widController.view];
            [self.view bringSubviewToFront:self.QRCodeScannerView];
            break;
        default:
            break;
    }
}

私はデバッグして段階的に進み、問題の原因を突き止めようとしました:

デコーダー (基礎となる ZXing ロジックの一部) は、デリゲート (ZXingWidgetController クラスである必要があります) から "failedToDecodeImage:" を呼び出そうとし、クラッシュします (EXC_BAD_ACCESS)

ステップスルー中に、ZXingWidgetController の「キャンセルされた」メソッドが呼び出されることがわかりました。このメソッドが呼び出される理由がよくわかりません。ウィジェットは、デコーダーを初期化して開始した直後に停止するべきではありません。

4

3 に答える 3

0

コントローラー ビューを別のビューのサブビューとして追加することは想定されていません。UIViewControllerさまざまなメカニズムを使用してコントローラーを提示することになっています。

あなたがしていることをすることによって、あなたはUIViewController契約に違反しています。ウィジェットは、などviewWillAppearのものを取得していません。viewDidAppear

UIViewレベルではなく/CALayerレベルで ZXing を使用する場合は、 ZXing objc ディレクトリUIViewController内のクラスを参照してください。

于 2012-08-14T20:07:08.450 に答える