【问题标题】:Error when trying to segue from one view controller to another尝试从一个视图控制器切换到另一个视图控制器时出错
【发布时间】:2021-12-31 18:14:22
【问题描述】:

我正在尝试在我的主视图控制器和我的预览视图控制器之间进行转场,以实际显示拍摄的照片。我在故事板中将这个 segue 命名为“showPhoto”。但是当我试图从主视图控制器实际切换到预览视图控制器时,我遇到了一些错误。第一个说“'HomeViewController'类型的值没有成员'image'”但是,我的预览视图控制器是这个图像被链接的地方,所以我不确定为什么Xcode说我的HomeView Controller没有成员图像,而它应该是我的预览正在继续的视图控制器。第二个错误再次表示“在范围内找不到'图像'”我的代码在下面,用于主视图控制器和预览视图控制器。

import UIKit
import AVFoundation

class HomeViewController: UIViewController, AVCapturePhotoCaptureDelegate {
    
    
    var captureSession =  AVCaptureSession()
    var backCamera: AVCaptureDevice?
    var frontCamera:  AVCaptureDevice?
    var currentCamera: AVCaptureDevice?
    var photoOutput:  AVCapturePhotoOutput?
    var cameraPreviewLayer: AVCaptureVideoPreviewLayer?
    
    @IBOutlet weak var camerabtn: UIButton!
    
    
    
    override func viewDidLoad() {
        super.viewDidLoad()
        setupCaptureSession()
        setupDevice()
        setupInputOutput()
        setupPreviewLayer()
        startRunningCaptureSession()
        
    }
    
    func setupCaptureSession() {
        
        captureSession.sessionPreset =  AVCaptureSession.Preset.photo
    }
    
    func setupDevice() {
        let deviceDiscoverySession = AVCaptureDevice.DiscoverySession(deviceTypes: [AVCaptureDevice.DeviceType.builtInWideAngleCamera], mediaType: AVMediaType.video, position: AVCaptureDevice.Position.unspecified)
        let devices = deviceDiscoverySession.devices
        
        for device in devices {
            if device.position == AVCaptureDevice.Position.back {
                backCamera = device
            } else if device.position == AVCaptureDevice.Position.front {
                frontCamera = device
            }
        }
        
        currentCamera = backCamera
    }
    
    func setupInputOutput() {
        do {
            let captureDeviceInput = try AVCaptureDeviceInput(device: currentCamera!)
            captureSession.addInput(captureDeviceInput)
            photoOutput = AVCapturePhotoOutput()
            photoOutput?.setPreparedPhotoSettingsArray([AVCapturePhotoSettings(format: [AVVideoCodecKey: AVVideoCodecType.jpeg])], completionHandler: nil)
            captureSession.addOutput(photoOutput!)
        } catch {
            print(error)
        }
    }
    
    func setupPreviewLayer() {
        cameraPreviewLayer = AVCaptureVideoPreviewLayer(session: captureSession)
        cameraPreviewLayer?.videoGravity = AVLayerVideoGravity.resizeAspectFill
        cameraPreviewLayer?.connection?.videoOrientation = AVCaptureVideoOrientation.portrait
        cameraPreviewLayer?.frame = self.view.frame
        self.view.layer.insertSublayer(cameraPreviewLayer!, at: 0)
    }
    func startRunningCaptureSession() {
        captureSession.startRunning()
    }
    
    @IBAction func camerabtn(_ sender: Any) {
        let settings = AVCapturePhotoSettings()
        photoOutput?.capturePhoto(with: settings, delegate: self)
        performSegue(withIdentifier: "showPhoto", sender: nil)
    }
    
    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showPhoto " {
            let previewVC = segue.destination as! PreviewViewController
            previewVC.image = self.image
        }
    }
    
    func photoOutput(_ output: AVCapturePhotoOutput, didFinishProcessingPhoto photo: AVCapturePhoto, error: Error?) {
        if let imageData = photo.fileDataRepresentation() {
            image = UIImage(data: imageData)
            performSegue(withIdentifier: "showPhoto", sender: nil)
        }
    }
}
    





import UIKit

class PreviewViewController: UIViewController {
    
    override func viewDidLoad() {
        super.viewDidLoad()
        
        
    }
    @IBOutlet weak var image : UIImageView!
    
    @IBAction func cancelbtn(_ sender: Any) {
    }
    
    
    @IBAction func savebtn(_ sender: Any) {
    }
}

【问题讨论】:

    标签: ios swift xcode avfoundation photo


    【解决方案1】:

    您正在尝试将 UIImage 传递给 UIImageView。它无法访问。 在您的 PreviewViewController 中,您应该为 UIImage 创建一个对象

    var newImage: UIImage!
    

    在 HomeViewController 中

      override func prepare(for segue: UIStoryboardSegue, sender: Any?) {
        if segue.identifier == "showPhoto " {
            let previewVC = segue.destination as! PreviewViewController
            previewVC.newImage = self.image
        }
    }
    

    【讨论】:

    • 我仍然有同样的错误“'HomeViewController'类型的值没有成员'newImage'”,“在范围内找不到'newImage'”,我添加了类PreviewViewController:UIViewController { var newImage:UIImage !覆盖 func viewDidLoad() { super.viewDidLoad() }
    • 清理项目并再次运行。也许它会工作
    • 已修复。问题是 var newImage: UIImage!也需要在主视图控制器中设置
    • 快乐编码.. :)
    • 谢谢!祝你编码愉快:)
    【解决方案2】:
    @IBOutlet weak var image : UIImageView!
    

    此图像属性不可访问,因此像这样创建图像的新属性。

    var newImage: UIImage!
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-23
      • 1970-01-01
      • 2013-07-25
      • 2013-03-12
      • 2015-10-04
      • 1970-01-01
      相关资源
      最近更新 更多