2016-11-07 2 views
2

Я не могу пройти UIImageView от tableView до UIViewController. Изображение отображается в TableView, но когда я пытаюсь перейти к другому представлению, он получает nilНевозможно передать изображение в другое изображение (после получения async)

метод, чтобы загрузить изображение является:

func loadImageFromUrl(url: String, view: UIImageView){ 

     // Create Url from string 
     let url = NSURL(string: url)! 

     // Download task: 
     // - sharedSession = global NSURLCache, NSHTTPCookieStorage and NSURLCredentialStorage objects. 
     let task = URLSession.shared.dataTask(with: url as URL) { (responseData, responseUrl, error) -> Void in 
      // if responseData is not null... 
      if let data = responseData{ 

       // execute in UI thread 
       DispatchQueue.main.async { 
        view.image = UIImage(data: data) 
       } 
      } 
     } 

     // Run task 
     task.resume() 
} 

И вот как я заселить мой tableView:

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = Bundle.main.loadNibNamed("UIProductTableViewCell", owner: self, options: nil)?.first as! UIProductTableViewCell 
    cell.selectionStyle = .none 

    //Populating data 
    cell.descriptionLabel.text = catalogOfProducts[indexPath.row].name 
    cell.priceLabel.text = catalogOfProducts[indexPath.row].regularPrice 

    if (catalogOfProducts[indexPath.row].productImageURL == "") { 
     cell.productImageView.image = UIImage(named: "noImage") 
    }else{ 
     loadImageFromUrl(url: catalogOfProducts[indexPath.row].productImageURL!, view: cell.productImageView) 

    } 
    catalogOfProducts[indexPath.row].productImage = cell.productImageView.image 
    return cell 
} 

catalogOfProducts[indexPath.row] как я передать UIImage к соответствующему объекту.

Чтобы передать данные через Segue, я просто передать Product объект:

func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) { 
    performSegue(withIdentifier: "productDetailSegue", sender: catalogOfProducts[indexPath.row]) 
} 

override func prepare(for segue: UIStoryboardSegue, sender: Any?) { 
     let productDetailViewController = segue.destination as! ProductDetailViewController 
     productDetailViewController.featuredProduct = (sender as? Product)! 
} 
+0

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

+0

прежде всего неправильным способом хранения всего изображения в массиве и передачи определенного изображения в другое представление, которое у вас есть использовать путь, где его скачали. – CodeChanger

+0

благодарит за ваш комментарий! На самом деле изображение хранится в свойстве «продукта». Массив просто хранит типы 'Product' –

ответ

2

Для просто управлять загруженными изображениями вы можете использовать библиотеку SDWebImage.

Связь SDWebImage: https://github.com/rs/SDWebImage

Эта библиотека красиво управлять изображениями с пути.

Как использовать SDWebImage:

cell.productImageView.sd_setImageWithURL(NSURL(string: catalogOfProducts[indexPath.row].productImageURL!), placeholderImage:UIImage(imageNamed:"placeholder.png")) 

, а просто передать свой URL изображения для следующего вида и Агинского использование того же кода, чтобы получить изображение в следующем виде.

Примечание: оно не будет загружать изображение и возвращать загруженное изображение, когда вы вызываете функцию функции.

Надеюсь, это поможет.

+0

Я проверю. Благодарю. –

+0

Это сработало ... большое спасибо!Я просто надеюсь, что это не будет делать загрузка каждый раз, когда он будет –

+0

Отлично! Да, он не будет загружать агин. – CodeChanger

0

вы не в состоянии передать взгляды в IOS, как я хотел бы иметь дело с этим в моих приложениях просто передать имя изображения и перезагрузить его в новом ViewController

+0

Не могли бы вы поделиться со мной, как вы храните изображение и передаете только имя? –

+0

Извините, в моем приложении У меня всегда есть доступ к имени изображения, но если у вас его нет, вы должны передавать данные изображения. К сожалению, я не так хорошо знаком с быстрым, но вот как вы конвертируете UIImage -> NSData, а затем NSData -> UIImage Вот пример в Objective-C http://stackoverflow.com/questions/20013144/convert-uiimage-to- NSData-и-встречно-UIImage – yawnobleix

1

По этому поводу -

override func подготовить (для segue: UIStoryboardSegue, отправитель: любой?) { let productDetailViewController = segue.destination as! ProductDetailViewController productDetailViewController.featuredProduct = (отправитель как продукт)! }

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

 Смежные вопросы

  • Нет связанных вопросов^_^