gpt4 book ai didi

ios - 无法在第二个 View Controller 中更新我的 UIImage

转载 作者:行者123 更新时间:2023-11-28 12:13:56 24 4
gpt4 key购买 nike

我在尝试从我的 JSON api 调用加载图像时遇到问题。基本上我已经创建了一个函数,它将调用我的 API 并获取图像 URL,然后将其显示在第二个 View Controller 中。目前我可以清楚地看到我的 URL 已正确传递,因为我已经在控制台中打印了它。但是,当我尝试更新我的 UIImage 时,我收到一条错误消息:

fatal error :在展开可选值时意外发现 nil

这是我的模型类文件:

class Exercise {
private var _id: Int!
private var _exerciseURL: String!
private var _imageUrl: URL!

var id: Int {

return _id
}

var exerciseURL: String {

return _exerciseURL
}

var imageURL: URL {

return _imageUrl // debug navigator is pointing at this line
}


init(name: String, description: String, id: Int) {
self._id = id

self._exerciseURL = "https://wger.de/api/v2/exerciseimage/?exercise=\(self.id)"

self._imageUrl = URL(string: "")
}


func parseImageData() {

let urlPath = _exerciseURL
let url = URL(string: urlPath!)

let task = URLSession.shared.dataTask(with: url!) { (data, response, error) in

if error != nil {
print("Error while parsing JSON")
}
else {

do {
if let data = data,
let fetchedImageData = try JSONSerialization.jsonObject(with: data, options: .mutableLeaves) as? [String:Any],
let images = fetchedImageData["results"] as? [[String: Any]] {


for eachImage in images {
let imageUrl = eachImage["image"] as! String
self._imageUrl = URL(string: imageUrl)
}

print(self.imageURL)


}
}
catch {
print("Error while parsing data.")
}
}
}
task.resume()
}

}

这是我的第二个 View Controller ,它应该根据其 url 更新图像。

class ExerciseDetailViewController: UIViewController {

var exercise: Exercise!

@IBOutlet weak var exerciseImage: UIImageView!

override func viewDidLoad() {
super.viewDidLoad()

exercise.parseImageData()

let data = NSData(contentsOf: exercise.imageURL)
exerciseImage.image = UIImage(data: data as! Data)


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

}

每当我试图注释掉

let data = NSData(contentsOf: exercise.imageURL) 
exerciseImage.image = UIImage(data: data as! Data)

然后测试我的结果,我可以看到我的语句“print(self.imageURL)”在第二个 VC 的控制台中正确显示了 URL。此外,代码中未显示的同一对象的其他变量(例如名称等)可由其他标签正确显示。

最佳答案

问题是您的网络请求 URLSession.shared.dataTask(with: url!) 是异步的,并且您在网络请求完成之前访问 exercise.imageURL并且 imageURL 仍然是 nil

为了更好地理解正在发生的事情,我鼓励您在行中设置断点:

// 1. In parseImageData()
self._imageUrl = URL(string: imageUrl)

// 2. In viewDidLoad()
let data = NSData(contentsOf: exercise.imageURL)

您会看到第二个断点首先被激活。

你需要做的就是等待网络请求和解析完成。为此,请阅读 Swift 中的完成处理程序并更改 parseImageData() 以接受完成处理程序。查看此答案以获取示例函数 https://stackoverflow.com/a/43317287/2247399

关于ios - 无法在第二个 View Controller 中更新我的 UIImage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47523188/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com