未调用 AVCaptureMetadataOutput 委托方法

AVCaptureMetadataOutput delegate method is not called

提问人:Rajendra 提问时间:10/10/2023 最后编辑:HangarRashRajendra 更新时间:10/10/2023 访问量:56

问:

我想使用类扫描二维码。我的代码如下,AVFoundation > AVCaptureMetadataOutput

@interface QRScannerViewController : UIViewController<AVCaptureMetadataOutputObjectsDelegate>{

- (void)startReading {
    NSError *error;
    
    AVCaptureDevice *captureDevice = [AVCaptureDevice defaultDeviceWithMediaType:AVMediaTypeVideo];
    AVCaptureDeviceInput *deviceInput = [AVCaptureDeviceInput deviceInputWithDevice:captureDevice error:&error];
    
    if(!deviceInput) {
        NSLog(@"deviceInput Error %@", error.localizedDescription);
    }
_captureSession = [[AVCaptureSession alloc]init];
[_captureSession addInput:deviceInput];

capturedMetadataOutput = [[AVCaptureMetadataOutput alloc] init];
[_captureSession addOutput:capturedMetadataOutput];
capturedMetadataOutput.metadataObjectTypes = @[AVMetadataObjectTypeQRCode];        
    dispatch_queue_t dispatchQueue = dispatch_queue_create("myQueue", NULL);
    [capturedMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];
    [capturedMetadataOutput setMetadataObjectTypes:[NSArray arrayWithObject:AVMetadataObjectTypeQRCode]];
    
    _videoPreviewLayer = [[AVCaptureVideoPreviewLayer alloc] initWithSession:_captureSession];
    
    [_viewPreview.layer addSublayer:_videoPreviewLayer];
        
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
        [self->_captureSession startRunning];
    });
}

- (void)captureOutput:(AVCaptureOutput *)output didOutputMetadataObjects:(NSArray<__kindof AVMetadataObject *> *)metadataObjects fromConnection:(AVCaptureConnection *)connection {
    
    if (metadataObjects != nil && metadataObjects.count > 0) {
        
        NSLog(@"%@", [metadataObjects objectAtIndex:0]);
         
        }
    }
}

我不明白为什么我没有接到电话。我将 AVMetadataObjectTypeQRCode 元数据值设置为 AVCaptureMetadataOutput。captureOutput:output didOutputMetadataObjects:metadataObjects fromConnectionconnection

iOS Objective-C AVFatafoundation

评论


答:

-1赞 user20325868 10/10/2023 #1

你记得认领 delagate 吗?self.delagate = QRScannerViewController

评论

0赞 Rajendra 10/10/2023
[capturedMetadataOutput setMetadataObjectsDelegate:self queue:dispatchQueue];此行符合协议。
0赞 user20325868 10/11/2023
是的,对不起,我习惯了在 swift 中工作。我的意思是在类声明中,但我看到你有它。我不再习惯在目标 c 中看到它了。
0赞 Rajendra 10/11/2023
它与相关的 swift 和 objective-C 类无关。是的,你的语法对正常的委托分配有效,但在 AVCaptureMetadataOutputObjectsDelegate 中,委托分配有不同的签名。