Я извлекаю некоторые данные JSON и отображаю их в UITableView (iOS / iPhone 8). Он отображает изображение, заголовок и описание каждого значения. Однако я успешно справился с этим, но у меня возникли проблемы с переносом изображения в отдельный контроллер просмотра.
Под этим я подразумеваю, что при касании ячейки на первом контроллере представления открывается другой контроллер представления, отображающий только информацию из этой ячейки.
Мне удалось сделать заголовок и описание доступными через глобальную переменную и indexPath
. Но то же самое не относится к изображению из-за конфликта со строками.
Я перечислил ниже, что я успешно сделал со строками заголовка и описания, а затем покажу свое предложение (что, конечно, не работает).
Как я могу получить изображение, которое уже было загружено и находится в массиве, чтобы быть доступным, как у меня уже есть с заголовком и описанием, для использования в другом View Controller?
Код, который форматирует и собирает значения из JSON:
if let jsonData = myJson as? [String : Any] { // Dictionary
if let myResults = jsonData["articles"] as? [[String : Any]] {
// dump(myResults)
for value in myResults {
if let myTitle = value["title"] as? String {
// print(myTitle)
myNews.displayTitle = myTitle
}
if let myDesc = value["description"] as? String {
myNews.displayDesc = myDesc
}
if let mySrc = value["urlToImage"] as? String {
// print(mySrc)
myNews.src = mySrc
}
self.myTableViewDataSource.append(myNews)
// dump(self.myTableViewDataSource)
// GCD
DispatchQueue.main.async {
self.myTableView.reloadData()
}
}
}
}
Две переменные у меня есть вне класса, чтобы использовать их глобально:
var petsIndex = ""
var petsDesc = ""
Код, который работает с UITableView и его ячейками:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let myCell = tableView.dequeueReusableCell(withIdentifier: "reuseCell", for: indexPath)
let myImageView = myCell.viewWithTag(2) as! UIImageView
let myTitleLabel = myCell.viewWithTag(1) as! UILabel
myTitleLabel.text = myTableViewDataSource[indexPath.row].displayTitle
let myURL = myTableViewDataSource[indexPath.row].src
loadImage(url: myURL, to: myImageView)
return myCell
}
Код, который я использую для отправки значений JSON в другой View Controller. Я достигаю этого, используя эти глобальные переменные:
// If a cell is selected, view transitions into a different view controller.
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
petsIndex = self.myTableViewDataSource[indexPath.row].displayTitle
petsDesc = self.myTableViewDataSource[indexPath.row].displayDesc
// Img needs to go here
myIndex = indexPath.row
performSegue(withIdentifier: "segue", sender: self)
}
Вот что я делал, чтобы решить мою проблему. Я преобразовал строку в UIImage?
или UIImageView?
и передал ее как данные. Я оставил переменную пустой и менял ее по мере поступления данных. Это произойдет, когда ячейка будет нажата. Затем внутри второго View Controller я бы использовал IBOutlet для UIImageView:
// Variable outside of the class
var petsImg: UIImageView? = nil
petsImg = self.myTableViewDataSource[indexPath.row].src
В этот момент я в тупике. Я получил ошибки об изображении, являющемся строкой и должно быть преобразовано. И когда она была преобразована, переменная всегда возвращалась пустой или ноль.
Обновление:
Я просто пытался сделать это. Работает и не выдает никаких ошибок. Тем не менее, я все еще получаю значение nil
petsImg = UIImage(named: self.myTableViewDataSource[indexPath.row].src)