从另一个先前的视图控制器中获取的变量,但我无法达到该值(nil错误)



我知道这是异步。请求,但我已经从上一个viewcontroller中取了posterPathOfMov。我不能真正了解问题在哪里。

import UIKit
class DetailMovieController: UIViewController {
    //Taken from previous VC but despite posterPathOfMov is not nil I could not request a web service the data
    var movieTitle : String!
    var descriptionMovie : String!
    var posterPathOfMov : String!
    let imageOfMovie : UIImageView = {
        let img = UIImageView()
        img.backgroundColor = .red
        img.translatesAutoresizingMaskIntoConstraints  = false
        return img
    }()
    let titleOfMovie : UILabel = {
        let tit = UILabel()
        tit.backgroundColor = .blue
        tit.translatesAutoresizingMaskIntoConstraints = false
        return tit
    }()
    let descOfMovie : UILabel = {
        let desc = UILabel()
        desc.backgroundColor = .yellow
        desc.numberOfLines = 20
        desc.translatesAutoresizingMaskIntoConstraints = false
        return desc
    }()
    override func viewDidLoad() {
        super.viewDidLoad()
        //Constraints for the views
        setUp()
        //Assignments
        descOfMovie.text = descriptionMovie
        titleOfMovie.text = movieTitle
        print(self.posterPathOfMov)
        let task = URLSession.shared.dataTask(with: URL(string:"https://image.tmdb.org/t/p/w780(self.posterPathOfMov)")!,completionHandler: { (data, res, err) in
            guard let imageData = data else {return}
            guard (err == nil) else {print(err!); return}
            print("hello2")
            DispatchQueue.main.async {
                self.imageOfMovie.image = UIImage(data: imageData)
            }
        });task.resume()
    }

控制台日志如下:

/9e2y5q7wlcvnehp5givtjhehx1o.jpg
致命错误:在解开可选值

时出乎意料地发现了无效

您的问题是URL无效。当您将字符串插头隐式拆开时,它在字符串中包含Optional(...)。您的URL是:

https://image.tmdb.org/t/p/w780Optional("/9E2y5Q7WlCVNEhP5GiVTjhEhx1o.jpg")

那不是有效的URL,因此您的!崩溃了。

将此代码包裹在if let posterPathOfMov = posterPathOfMov中以摆脱可选的(或添加??来解决它)。如果您切换到常规?选项而不是!

,此问题将更加明显

首先,除非您肯定不是零:

let task = URLSession.shared.dataTask(with: URL(string:"https://image.tmdb.org/t/p/w780(self.posterPathOfMov)")!

尽管您对self.posterpathofmov中的字符串的假设,但此代码未产生有效的URL。

URL无效的原因是您将pathofmov称为字符串!

这是一个可选的url(字符串:" https://image.tmdb.org/t/p/w780(posterPathofMov)")生产nil。

您可以使用:

解决此问题
if let path = posterPathOfMov {
    let url = URL(string:"https://image.tmdb.org/t/p/w780(path)")
}

此处清洁程序工作迅速代码:

if let path = self.posterPathOfMov,
    let url = URL(string:"https://image.tmdb.org/t/p/w780(path)") {
    let task = URLSession.shared.dataTask(with: url, completionHandler: { (data, res, err) in
        guard let imageData = data else {return}
        guard (err == nil) else {print(err!); return}
        print("hello2")
        DispatchQueue.main.async {
            self.imageOfMovie.image = UIImage(data: imageData)
        }
    })
    task.resume()
}

最新更新