Передача данных из UITableView на ViewController
Столкнулся со следующей проблемой: Есть tableView , по клику на него нужно передать информацию из ячейки во всплывающий ViewController для подробного отображения информации. Так же создал модель , и в ListViewController был создан массив , по этой модели (в будущем ожидается работа с сетью , в данный момент хочу настроить шаблон приложения локально). Вопрос заключается в том , чтобы передать информацию из ячейки tableView во всплывающий viewController. Буду рад помощи более опытных коллег , заранее спасибо за помощь!
ViewController с tableView:
import UIKit
let image = UIImage(named: "testImage")
var movies: [Movie] = [Movie(name: "FirstMovie", overview: "some1", year: "2001", image: image!),
Movie(name: "SecondMovie", overview: "some2", year: "2002", image: image!),
Movie(name: "ThirdMovie", overview: "some3", year: "2003", image: image!)]
class ListViewController: UIViewController {
@IBOutlet var tableView: UITableView!
override func viewDidLoad() {
super.viewDidLoad()
}
}
extension ListViewController: UITableViewDelegate , UITableViewDataSource {
func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return movies.count
}
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let movie = movies[indexPath.row]
let cell = tableView.dequeueReusableCell(withIdentifier: "ListCell" , for: indexPath) as! ListCell
cell.setMovie(movie: movie)
return cell
}
func tableView(_ tableView: UITableView, heightForRowAt indexPath: IndexPath) -> CGFloat {
174
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
let vc = storyboard?.instantiateViewController(withIdentifier: "DetailsViewController") as! DetailsViewController
vc.modalPresentationStyle = .formSheet
present(vc, animated: true, completion: nil)
}
}
Всплывающий ViewController:
import UIKit
class DetailsViewController: UIViewController {
var detailmovies: Movie?
@IBOutlet var detailsImage: UIImageView!
@IBOutlet var detailsName: UILabel!
@IBOutlet var detailsOverview: UILabel!
@IBOutlet var detailsYear: UILabel!
override func viewDidLoad() {
super.viewDidLoad()
}
func setDetail(movie: Movie) {
self.detailsName.text = movie.name
self.detailsImage.image = image
self.detailsYear.text = movie.year
self.detailsOverview.text = movie.overview
}
}
Модель:
import UIKit
struct Movie {
var name: String
var overview: String
var year: String
var image: UIImage
}
Ответы (1 шт):
Вообще для таких целей можно просто передавать в ваш целевой ViewController модель данных. У вас происходит выбор элемента массива приблизительно так:
let model = movies[indexPath.section]
в конечном контроллере вы создаете переменную которая называется например так:
var model:Movie?
и при переходе вы ее передаете:
let vc = storyboard?.instantiateViewController(withIdentifier: "DetailsViewController") as! DetailsViewController
vc.modalPresentationStyle = .formSheet
vc.model = movies[indexPath.section]
present(vc, animated: true, completion: nil)
ну а дальше уже можно с ней делать все то же самое что и на первом контроллере