gpt4 book ai didi

ios - 多次调用委托(delegate)方法,即使在返回 View 后也是如此

转载 作者:可可西里 更新时间:2023-11-01 04:22:34 27 4
gpt4 key购买 nike

我正在创建一个使用 iOS 7 中新的条形码扫描器的应用程序,但我在使用委托(delegate)方法时遇到了一些问题。扫描器正确识别条形码并调用委托(delegate)方法,但它执行得太快,因此调用连续发生多次,导致连续执行多次。下面的委托(delegate)方法。

- (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,委托(delegate)将被多次调用,从而导致 View 层次结构损坏(然后崩溃)。另一个问题是,当我禁用连接然后在 viewWillAppear 中使用 self.conn = YES 重新启用连接时,返回 View 时将从之前的扫描中重复调用委托(delegate)。这会导致 View 层次结构中的另一个损坏。

因此总结一下:委托(delegate)方法被快速连续调用多次,或者委托(delegate)在返回 View 时被(旧)扫描调用。任何帮助将不胜感激。

编辑:我已经部分设法通过对委托(delegate)进行一些烦躁来解决这个问题,但是我仍然遇到委托(delegate)方法被多次调用的问题。如果您在不到五秒的时间内从下一个 View Controller 返回,将再次调用委托(delegate)方法。

最佳答案

我认为您已经开始使用 captureSessioncaptureSession?.startRunning() 方法,但一旦您从委托(delegate)中的 QRCode 获得输出,它就不会停止...

只需使用这个 [captureSession stopRunning];//在 Objective-C 中

以下是我在 swift 中针对相同问题所做的处理

//MARK:- AVCapture 委托(delegate)在检测到元数据时查找

func captureOutput(captureOutput: AVCaptureOutput!, didOutputMetadataObjects metadataObjects: [AnyObject]!, fromConnection connection: AVCaptureConnection!) {

// Check if the metadataObjects array is not nil and it contains at least one object.
if metadataObjects == nil || metadataObjects.count == 0 {
qrCodeFrameView?.frame = CGRectZero
return
}

// Get the metadata object.
let metadataObj = metadataObjects[0] as! AVMetadataMachineReadableCodeObject

if metadataObj.type == AVMetadataObjectTypeQRCode {
// If the found metadata is equal to the QR code metadata then update the status label's text and set the bounds
let barCodeObject = videoPreviewLayer?.transformedMetadataObjectForMetadataObject(metadataObj as AVMetadataMachineReadableCodeObject) as! AVMetadataMachineReadableCodeObject
qrCodeFrameView?.frame = barCodeObject.bounds;

if metadataObj.stringValue != nil {
captureSession?.stopRunning() // Stop captureSession here... :)
self.performSegueWithIdentifier("yourNextViewController", sender: self)
}
}
}

关于ios - 多次调用委托(delegate)方法,即使在返回 View 后也是如此,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19093046/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com