【问题标题】:Unexpectedly found nil while unwrapping optional value image在展开可选值图像时意外发现 nil
【发布时间】:2018-09-08 10:17:22
【问题描述】:

目标控制器

class CharDetailsViewController: UIViewController {

    @IBOutlet weak var imageView: UIImageView!
    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var genderLabel: UILabel!
    @IBOutlet weak var houseLabel: UILabel!
    @IBOutlet weak var ancestryLabel: UILabel!

    var image = UIImage()
    var name = String()
    var gender = String()
    var house = String()
    var ancestry = String()

    override func viewDidLoad() {
        super.viewDidLoad()
        imageView.image = image
        nameLabel.text! = name
        houseLabel.text! = house

        // Do any additional setup after loading the view.
    }

源控制器

class CharacterTableViewController: UITableViewController {

    var charactersData = [Character]()
    override func viewDidLoad() {
        super.viewDidLoad()
        loadData()
    }

    func loadData()
    {
        DispatchQueue.main.async {
            Alamofire.request("http://hp-api.herokuapp.com/api/characters").responseJSON(completionHandler: {
                (response) in
                switch response.result
                {
                case.success(let value):
                    let json = JSON(value)
                    print(json)
                    json.array?.forEach({
                        (character) in
                        let character = Character(name: character["name"].stringValue, house:character["house"].stringValue,image:character["image"].stringValue, gender: character["gender"].stringValue, ancestry: character["ancestry"].stringValue)
                        self.charactersData.append(character)
                    })
                    self.tableView.reloadData()
                case.failure(let error):
                    print(error.localizedDescription)
                }
            })
        }
    }
override func tableView( tableView: UITableView, numberOfRowsInSection section: Int) -> Int {

        return charactersData.count
    }


    override func tableView( tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! CharTableViewCell

        cell.nameLabel.text = "Name: " +  charactersData[indexPath.row].name
        cell.houseLabel.text = "House: " + charactersData[indexPath.row].house

        if let imageURL = URL(string: self.charactersData[indexPath.row].image) {
            DispatchQueue.global().async {
                let data = try? Data(contentsOf: imageURL)
                if let data = data {
                    let image = UIImage(data: data)
                    DispatchQueue.main.async {
                        cell.charImageView.image = image
                    }
                }
            }
        }
        return cell
    }

    override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {

        let hpc = storyboard?.instantiateViewController(withIdentifier: "CharDetails") as? CharDetailsViewController

        hpc?.image = UIImage(named: charactersData[indexPath.row].image)! //Error found here

        hpc?.name = charactersData[indexPath.row].name
        hpc?.house = charactersData[indexPath.row].house
        self.navigationController?.pushViewController(hpc!, animated: true)
    }

class Character
{
    var name : String
    var house : String
    var image : String


    init(name: String, house: String, image: String)
    {
        self.name = name
        self.house = house
        self.image = image
    }
}

我在展开可选值图像以将图像传递给另一个控制器时意外发现 nil。我已经检查了商店,它们非常好。图像是从 url 数组中以 JSON 格式获取的,如上所示,它们在表格视图上工作正常并在表格视图上看到,但它们没有显示在详细信息视图页面上。请帮助我。

【问题讨论】:

    标签: swift alamofire


    【解决方案1】:

    您正试图强制解开 UIImage,它是 nil。 UIImage(named:) 方法用于当图像存在于包中并且您想从那里显示它时。

    hpc?.image = UIImage(named: charactersData[indexPath.row].image)! //Error found here
    

    在上述行中,您使用的是 UIImage(named:)!这意味着,您强制解包它,这会导致 在解包可选值时意外发现 nil

    崩溃

    解决方案 可以传图片名和名字和房子一样,

    1) 更新你的

    class CharDetailsViewController: UIViewController {
      // Add this property to hold url string for image. 
      var imageUrlString = String()
    }
    

    2) 在 didSelectRow 中,更新代码以传递 imageUrlString

    hpc?.imageUrlString = charactersData[indexPath.row].image
    

    2) 把它放在 CharDetailsViewController 的 viewDidLoad 方法中

    if let imageURL = URL(string: imageUrlString) {
        DispatchQueue.global().async {
            let data = try? Data(contentsOf: imageURL)
            if let data = data {
                let image = UIImage(data: data)
                DispatchQueue.main.async {
                    self.imageView.image = image
                }
            }
        }
    }
    

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-23
      • 2016-10-18
      • 2017-04-09
      • 2018-09-22
      • 2016-06-26
      • 2016-03-12
      相关资源
      最近更新 更多