iOS 7 で新しいバーコード スキャナーを使用するアプリを作成していますが、デリゲート メソッドに問題があります。スキャナはバーコードを正しく識別し、デリゲート メソッドを呼び出しますが、実行が速すぎるため、呼び出しが連続して何度も発生し、セグエが複数回実行されます。以下の委任方法。
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputMetadataObjects:(NSArray *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
connection.enabled = NO;
self.conn = connection;
for (AVMetadataObject *metadata in metadataObjects) {
if ([metadata.type isEqualToString:AVMetadataObjectTypeEAN8Code] || [metadata.type isEqualToString:AVMetadataObjectTypeEAN13Code]) {
self.strValue = [(AVMetadataMachineReadableCodeObject *)metadata stringValue];
NSLog(@"%@", [(AVMetadataMachineReadableCodeObject *)metadata corners]);
}
}
[self performSegueWithIdentifier:@"newSegue" sender:self];
}
問題は、最初の行で設定しないconnection.enabled = NO
と、デリゲートが複数回呼び出され、ビュー階層が破損する (そしてクラッシュする) ことです。もう1つの問題は、接続を無効にしてからviewWillAppearを使用して接続を再度有効にするself.conn = YES
と、ビューに戻るときに以前のスキャンからデリゲートが繰り返し呼び出されることです。これにより、ビュー階層に別の破損が発生します。
要約すると、デリゲート メソッドが立て続けに複数回呼び出されているか、ビューに戻るときに (古い) スキャンでデリゲートが呼び出されています。どんな助けでも大歓迎です。
編集:デリゲートをいじることで問題を部分的に回避することができましたが、デリゲートメソッドが複数回呼び出されるという問題がまだあります。次のビューコントローラーから 5 秒以内に戻ると、デリゲート メソッドが再度呼び出されます。