Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios RemoveFromSuperview不';t似乎删除了我创建的子视图_Ios_Swift_Qr Code - Fatal编程技术网

Ios RemoveFromSuperview不';t似乎删除了我创建的子视图

Ios RemoveFromSuperview不';t似乎删除了我创建的子视图,ios,swift,qr-code,Ios,Swift,Qr Code,我正在使用swift代码进行测试,以制作二维码扫描仪,重置时无法移除红色边框 我在viewDidLoad中有以下代码 // Red box highlight qrCodeFrameView.layer.borderColor = UIColor.redColor().CGColor qrCodeFrameView.layer.borderWidth = 2 viewForLayer.addSubview(qrCodeFrameView) viewForLayer

我正在使用swift代码进行测试,以制作二维码扫描仪,重置时无法移除红色边框

我在viewDidLoad中有以下代码

// Red box highlight
    qrCodeFrameView.layer.borderColor = UIColor.redColor().CGColor
    qrCodeFrameView.layer.borderWidth = 2
    viewForLayer.addSubview(qrCodeFrameView)
    viewForLayer.bringSubviewToFront(qrCodeFrameView)
    // End box highlight
现在,当扫描QR时,会显示边界:

let barCodeObject = self.previewLayer?.transformedMetadataObjectForMetadataObject(metadataObject as! AVMetadataMachineReadableCodeObject) as!  AVMetadataMachineReadableCodeObject
        qrCodeFrameView.frame = barCodeObject.bounds
我喜欢用一个重置按钮来移除边框,并且能够重新扫描。通过以下操作,我可以重新扫描,但最后一个红色矩形仍然可见

        @IBAction func resetButtonTapped(sender: AnyObject) {
        self.refreshView()
    }

    func refreshView(){
        //remove frame border
        qrCodeFrameView.removeFromSuperview()
        self.viewDidLoad()   
self.viewWillAppear(true)
    }
我在qrCodeFrameView.removeFromSuperview()上添加了一个断点,它就停在那里,但我不知道它到底在寻找什么。(我的意思是,对于变量,我得到了它,但对于removeFromSuperview,我不知道会发生什么??)

问候

[编辑] 好的,我按照提示从不调用ViewDid加载ViewDid直接显示,我创建了一个单独的函数cameraLayerWithBorder(),但红色边框仍然显示在reset/refreshView上

 func cameraLayerWithBorder(){
        view.backgroundColor = UIColor.blackColor()
        captureSession = AVCaptureSession()

        let videoCaptureDevice = AVCaptureDevice.defaultDeviceWithMediaType(AVMediaTypeVideo)
        let videoInput: AVCaptureDeviceInput

//capture image code .......

        // Previewlayer with camera added to a placed layer 
        previewLayer = AVCaptureVideoPreviewLayer(session: captureSession);
        previewLayer.frame = viewForLayer.bounds;
        previewLayer.videoGravity = AVLayerVideoGravityResizeAspectFill;
        viewForLayer.layer.addSublayer(previewLayer);


        // Red box highlight
        qrCodeFrameView.layer.borderColor = UIColor.redColor().CGColor
        qrCodeFrameView.layer.borderWidth = 2
        viewForLayer.addSubview(qrCodeFrameView)
        viewForLayer.bringSubviewToFront(qrCodeFrameView)
        // End box highlight

         captureSession.startRunning();
    }
我编辑了refreshView()

此函数的一部分用于设置红色边框

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

    if let metadataObject = metadataObjects.first {//fula says let verwijderen
        let readableObject = metadataObject as! AVMetadataMachineReadableCodeObject;

        AudioServicesPlaySystemSound(SystemSoundID(kSystemSoundID_Vibrate))
        // add red borders
        let barCodeObject = self.previewLayer?.transformedMetadataObjectForMetadataObject(metadataObject as! AVMetadataMachineReadableCodeObject) as! AVMetadataMachineReadableCodeObject
        qrCodeFrameView.frame = barCodeObject.bounds
        // end add red borders
        foundCode(readableObject.stringValue);
    }

    dismissViewControllerAnimated(true, completion: nil)
}
以下是调试中视图的屏幕截图(红色边框为UIWindow>UIView>UIView>UIView

[编辑2] 可行的解决方案,感谢Ibrahim,我忽略了显而易见的问题,我不得不将框架边界代码部分从函数cameraLayerWithBorder添加到captureOutput函数

 // Red box highlight

        qrCodeFrameView.layer.borderColor = UIColor.redColor().CGColor
        qrCodeFrameView.layer.borderWidth = 2
        viewForLayer.addSubview(qrCodeFrameView)
        viewForLayer.bringSubviewToFront(qrCodeFrameView)
        // End box highlight

仍然不确定这是否是处理UI操作时必须使用的方法

主队列

目标C 敏捷的
resetButtonTapped()
中将视图从其超级视图中删除,但随后调用函数
cameraLayerWithBorder()
。在该方法中,再次添加
qrCodeFrameView

以后不要调用
cameraLayerWithBorder()
,而是使用
resetButtonTapped()
中要执行的操作编写新代码,或者创建一个新方法并在删除后调用它

--第一个答案--

尝试删除
viewDidLoad()
&
viewDidLoad()
,我想这就是原因。不是100%确定。但是在这种情况下,您不必调用这些方法,但是如果您想调用
viewDidLoad
,请使用这种方法


仅从superview中删除将不起作用,您还需要删除预览层。请尝试下面的操作,希望它能起作用

videoPreviewLayer?.removeFromSuperlayer()
view.sendSubview(toBack: self.qrCodeFrameView!)
self.qrCodeFrameView?.removeFromSuperview()
captureSession?.stopRunning()

如果这不起作用,请告诉我。

永远不要调用
viewDidLoad
viewwillbeen
yourself.tx,我已经对这两个函数进行了注释,并使用viewDidLoad()中最初的代码添加了一个函数这是不需要的。所有这些都已经在主线程上完成了。答案是正确的,如果您正在处理服务器请求,您必须在主队列中执行此操作。SWIFT 4 DispatchQueue.main.async{self.XXX.removeFromSuperview()}hi Ibrahim,我已经用代码添加了函数(请参见我的编辑)但是边界还是显示出来了,但是cameraLayerWithBorder()有我喜欢执行的代码。将其视为一种初始状态,扫描代码后,我喜欢返回到第一种状态,因此我认为我可以重用代码。但我明白你的意思。嗯,因此你仍然希望在单击重置时显示
qrCodeFrameView
,但不显示红色边框?你能更轻松一些吗具体的
dispatch_async(dispatch_get_main_queue(),^{
    [qrCodeFrameView removeFromSuperview]
 })
dispatch_async(dispatch_get_main_queue()) {
    qrCodeFrameView.removeFromSuperview()
}
videoPreviewLayer?.removeFromSuperlayer()
view.sendSubview(toBack: self.qrCodeFrameView!)
self.qrCodeFrameView?.removeFromSuperview()
captureSession?.stopRunning()