代码之家  ›  专栏  ›  技术社区  ›  Amanda

“致命错误:展开图像视图的可选值时意外发现nil”

  •  0
  • Amanda  · 技术社区  · 10 年前

    我有一个视图,有一个按钮和一个ImageView。按下时,按钮触发UIImagePickerController,UIView将显示拾取的图像。我试过这么做 不使用情节提要 ,但我一直得到 "fatal error: unexpectedly found nil while unwrapping an Optional value" 在这条线上 imageView.contentMode = .ScaleAspectFit 。我看过其他建议使用 editingInfo[UIImagePickerControllerOriginalImage] 而不是 info[UIImagePickerControllerOriginalImage] ,但没有奏效。如何解决此问题?

    import UIKit
    
    class EditViewController: UIViewController, UIImagePickerControllerDelegate, UINavigationControllerDelegate {
    
    var imageView: UIImageView!=nil
    
    override func viewDidLoad() {
        super.viewDidLoad()
        createBackground()
        createImageView()
        createButton()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func createBackground() {
        let backgroundImage = UIImage(named: "pinetree")
        var imageView: UIImageView!
        imageView = UIImageView(frame: view.bounds)
        imageView.contentMode = .ScaleAspectFill
        imageView.clipsToBounds = true
        imageView.image = backgroundImage
        imageView.center = view.center
        view.addSubview(imageView)
        self.view.sendSubviewToBack(imageView)
    }
    
    func createImageView() {
        var image: UIImage!
        var imageView = UIImageView(image: image)
        imageView.frame = CGRectMake(view.bounds.width/2, view.bounds.height/2, view.bounds.width, view.bounds.height*(3/4))
        self.view.addSubview(imageView)
    }
    
    func createButton() {
        let size = view.bounds.width
        let cx = view.bounds.width/2
        let cy = view.bounds.height * 4/5
        let button = UIButton();
        button.frame = CGRectMake(0, 0, size, size)
        button.center.x = cx
        button.center.y = cy
        button.setTitle("Load Image", forState: .Normal)
        button.addTarget(self, action: "loadImageButtonPressed:", forControlEvents: .TouchUpInside)
        self.view.addSubview(button)
    }
    
    func loadImageButtonPressed(sender: UIButton!) {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary){
            var imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary;
            //imagePicker.mediaTypes = [kUTTypeImage];
            imagePicker.allowsEditing = false
            self.presentViewController(imagePicker, animated: true, completion: nil)
        }
    }
    
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
            imageView.contentMode = .ScaleAspectFit
            imageView.image = pickedImage
        }
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    }
    
    1 回复  |  直到 10 年前
        1
  •  1
  •   Amanda    10 年前

    我找到了答案!我意识到我已经启动了变量 imageView 两次(在班上 EditViewController &在函数中 createImageView() ). 我删除了 图像视图 在函数中 创建图像视图() 并编辑了类中imageView的启动。我更新的代码是:

    import UIKit
    
    class EditViewController: UIViewController, UINavigationControllerDelegate, UIImagePickerControllerDelegate {
    
    var imageView = UIImageView(image: UIImage(named: "ClearImage"))
    
    override func viewDidLoad() {
        super.viewDidLoad()
    }
    
    override func viewDidAppear(animated: Bool) {
        super.viewDidAppear(animated)
        createBackground()
        createImageView()
        createButton()
    }
    
    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
    
    func createBackground() {
        let backgroundImage = UIImage(named: "pinetree")
        var imageView: UIImageView!
        imageView = UIImageView(frame: view.bounds)
        imageView.contentMode = .ScaleAspectFill
        imageView.clipsToBounds = true
        imageView.image = backgroundImage
        imageView.center = view.center
        view.addSubview(imageView)
        self.view.sendSubviewToBack(imageView)
    }
    
    func createImageView() {
        imageView.frame = CGRectMake(0,0, view.bounds.width, view.bounds.height*(3/4))
        self.view.addSubview(imageView)
    }
    
    func createButton() {
        let size = view.bounds.width
        let cx = view.bounds.width/2
        let cy = view.bounds.height * 4/5
        let button = UIButton();
        button.frame = CGRectMake(0, 0, 200, 200)
        button.center.x = cx
        button.center.y = cy
        button.setTitle("Load Image", forState: .Normal)
        button.addTarget(self, action: "loadImageButtonPressed:", forControlEvents: .TouchUpInside)
        self.view.addSubview(button)
    }
    
    func loadImageButtonPressed(sender: UIButton!) {
        if UIImagePickerController.isSourceTypeAvailable(UIImagePickerControllerSourceType.PhotoLibrary){
            var imagePicker = UIImagePickerController()
            imagePicker.delegate = self
            imagePicker.sourceType = UIImagePickerControllerSourceType.PhotoLibrary;
            //imagePicker.mediaTypes = [kUTTypeImage];
            imagePicker.allowsEditing = false
            self.presentViewController(imagePicker, animated: true, completion: nil)
        }
    }
    
    func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [String : AnyObject]) {
        if let pickedImage = info[UIImagePickerControllerOriginalImage] as? UIImage {
            imageView.contentMode = .ScaleAspectFit
            imageView.image = pickedImage
        }
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    
    func imagePickerControllerDidCancel(picker: UIImagePickerController) {
        dismissViewControllerAnimated(true, completion: nil)
    }
    
    }