将数据从一个视图控制器传递到另一个视图控制器(图像)



错误:

线程 1:EXC_BAD_INSTRUCTION(代码 = EXC_I386_INVOP,子代码 = 0x0(

目标控制器

var getImage = UIImage()
var name = String()
var gender = String()
var house = String()
var ancestry = String()
override func viewDidLoad() {
super.viewDidLoad()
imageView.image = (charData.image)as! UIImage
nameLabel.text! = name
houseLabel.text! = house
// Do any additional setup after loading the view.
}

源控制器

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?.getImage =  (charactersData[indexPath.row].image) as! UIImage
hpc?.name = charactersData[indexPath.row].name
hpc?.house = charactersData[indexPath.row].house
self.navigationController?.pushViewController(hpc!, animated: true)
}

我试图将图像传递给另一个控制器,但似乎我遇到了错误,有人可以帮助我吗?除图像外,所有其他数据(如名称和房屋(都正确传递。请让我知道在哪里进行更改

这可能有效:

override func viewDidLoad() {
super.viewDidLoad()
imageView.image = getimage   // change this in view did load method
}

你做错了(这不是UIImage,这是URL字符串,所以你可以使用这个url字符串下载图像(:

hpc?.getImage =  (charactersData[indexPath.row].image) as! UIImage

请将UIImage替换为字符串,因为这不是UIImage,这是用于下载图像的字符串URL

因此,为此,您必须将getImage变量UIImage更改为字符串并将此字符串传递给此变量

var getImage = String()
hpc?.getImage =  (charactersData[indexPath.row].image) as! String

之后再次从另一个控制器中的URL下载此图像,但这种方式不好,因此请遵循以下方法:

您还有另一种选择,例如下载图像时,而不是将其保存CharacterStruct并在didselect时传递

过程:

  1. 在字符结构/模型中添加新变量,如图像
  2. 在结构/模型中调用 API 时分配下载的图像
  3. 并在didSelect时将此映像传递给另一个控制器

最新更新