Передача данных из TableViewController в другой ViewController

tableview

#1

Всем привет. Я только начал изучать программирование и полный ноль в разработке, методом проб и ошибок смог распарсить JSON. теперь хочу передать данные, точнее изображение в другой VC. Как это сделать через segue или без?

Первый VC.

class TableViewController: UITableViewController {

private var urlOfPersons = "https://rickandmortyapi.com/api/character"
private var result: [Result]?

override func viewDidLoad() {
    super.viewDidLoad()
    
    fetchData()
}

// MARK: - Table view data source

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return 20
}



override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    
    let cell = tableView.dequeueReusableCell(withIdentifier: "cell", for: indexPath) as! TableViewCell

    if let count = result?.count, count > 1 {
        let lastElement = count - 1
        if indexPath.row == lastElement {
            getData()
        }
    }
    let dataIndex = (result?[indexPath.row])!
    cell.getImageData(from: dataIndex)
    cell.nameLabel.text = (self.result?[indexPath.row].name ?? "o")
    return cell
}



override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
    guard let vc = storyboard?.instantiateViewController(identifier: "showImage")
            as? ShowViewController else { return }
    
    vc.data = result?[indexPath.row]
}

// MARK: - UICollectionViewDelegate

func fetchData() {
    result = []
    getData()
}

func getData() {
    guard let url = URL(string: urlOfPersons) else { return }
    
    URLSession.shared.dataTask(with: url) { (data, response, error) in
        guard let data = data else { return }
        
        do {
            let decoder = JSONDecoder()
            let decode = try decoder.decode(Characters.self, from: data)
            self.result?.append(contentsOf: decode.results)
            
            DispatchQueue.main.async {
                self.tableView.reloadData()
            }
        } catch let error as NSError {
            print(error.localizedDescription)
        }
    }.resume()
}

мой TableView:

class TableViewCell: UITableViewCell {

@IBOutlet var personImage: UIImageView!
@IBOutlet var nameLabel: UILabel!

func getImageData(from result: Result) {
    DispatchQueue.global().async {
        guard let imageUrl = URL(string: result.image) else { return }
        guard let imageData = try? Data(contentsOf: imageUrl) else { return }
        
        DispatchQueue.main.async {
            self.personImage.image = UIImage(data: imageData)
        }
    }
}

Второй VC.

class ShowViewController: UIViewController {

@IBOutlet var pictureLabel: UIImageView!

var pictureName: String = "   "
var data: Result?


override func viewDidLoad() {
    super.viewDidLoad()
    
    let image = data?.image
    
}

Модель данных:

struct Characters: Codable {

let results: [Result]

}

struct Result: Codable {

let name: String

let image : String

}


#2

Способов передачи данных достаточно, так же как и созданных тем на этот вопрос.
В didSelectRowAt нужно вызывать segue, а в методе prepare уже будет передача данных, если совсем просто.


#3

Погулите pass data between controllers swift. Там найдете передачу данных на любой вкус)