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

Posted

技术标签:

【中文标题】将数据从一个视图控制器传递到另一个(图像)【英文标题】:Passing Data from one view controller to another (Image) 【发布时间】:2018-09-08 08:49:50 【问题描述】:

错误:

线程 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)

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

【问题讨论】:

欢迎来到 ***。要快速获得答案,请尝试编辑您的问题以澄清您的问题描述。通常你应该把你的问题描述放在你的代码之前。如需指导,请查看how to ask 页面和this。网站导览有帮助! 你不应该从另一个视图控制器接收带有 viewDidLoad 的对象。 【参考方案1】:

这可能有效:

override func viewDidLoad() 
    super.viewDidLoad()

    imageView.image = getimage   // change this in view did load method

【讨论】:

我已经说过了,但现在它给了我这个错误 - 无法将“String”类型的值分配给“UIImage”类型 - 你知道如何纠正这个错误吗? 可能是您从 API 获取字符串 URL,首先将此 URL 转换为 UIImage,然后分配给变量。【参考方案2】:

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

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

请把UIImage换成String,因为这不是UIImage,这是下载图片的String URL

所以为此您必须将getImage 变量 UIImage 更改为 String 并将此 String 传递给此变量

var getImage = String()

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

之后再次从另一个控制器中的 URL 下载此图像,但这种方式并不好,因此您可以按照以下方式进行操作:

或者

你有另一个选择,比如当你下载图像而不是保存它CharacterStruct并在didselect时传递它

流程:

    在 Character Struct/Model 中添加新的变量,如图像 在 Struct/Model 中调用 API 时分配下载的图像 并在didSelect 时将此图像传递给另一个控制器

【讨论】:

以上是关于将数据从一个视图控制器传递到另一个(图像)的主要内容,如果未能解决你的问题,请参考以下文章

当数据从一个视图控制器传递到另一个视图控制器时,我如何能够传递图像?

快速将图像从一个视图控制器传递到另一个视图控制器

如何以编程方式将数据从表视图控制器传递到另一个控制器? [复制]

将数据从带有页面控制器的 uiscrollview 传递到另一个视图控制器 [关闭]

将图像从集合视图控制器快速传递到另一个视图控制器

将图像从一个视图控制器传递到另一个控制器给出nil