Передача данных из одного контроллера представления в другой (изображение) - PullRequest
0 голосов
/ 08 сентября 2018

Ошибка:

Поток 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)
}

Я пытаюсь передать изображение на другой контроллер, но мне кажется, что я получаю эту ошибку, может кто-нибудь любезно поможет мне. Все остальные данные, такие как имя и дом, передаются правильно, кроме изображения. Пожалуйста, дайте мне знать, где внести изменения

Ответы [ 2 ]

0 голосов
/ 08 сентября 2018

Вы делаете неправильно (это не UIImage, это строка URL, поэтому вы можете использовать эту строку URL для загрузки изображения):

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

Пожалуйста, замените UIImage на String, потому что это не UIImage, это String URL для загрузки изображения

Итак, для этого вам нужно изменить getImage переменную UIImage на String и передать эту строку этой переменной

var getImage = String()

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

После этого снова загрузите это изображение с URL-адреса в другом контроллере, но этот способ не подходит, поэтому вы должны следовать нижеуказанному пути:

Или

У вас есть другой вариант, например, когда вы загружаете изображение, чем сохраняете его Character Struct и передаете его, когда didselect

Процесс: * * один тысяча двадцать-одна

  1. Добавить новую переменную как изображение в Character Struct / Model
  2. Назначение загруженного изображения при вызове API в Struct / Model
  3. И передать это изображение другому контроллеру, когда didSelect
0 голосов
/ 08 сентября 2018

Это может сработать:

override func viewDidLoad() {
    super.viewDidLoad()

    imageView.image = getimage   // change this in view did load method
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...