Передача значений из TableViewCell в подробный вид
Как и некоторые другие посты, которые я просеял, вот часть, где я говорю, что я новичок в Swift. У меня есть приложение, которое позволяет вам хранить изображения и данные (через Core Data) для ваших любимых фильмов. Эта часть отлично работает. Я могу создать новый пост и просмотреть его через мой tableViewCell. Часть, с которой у меня возникла проблема, это отображение изображения и данных на странице сведений после нажатия на ячейку.
Я читал другие публикации и статьи на эту тему, и я уверен, что мне нужно использовать didSelectRowAtIndexPath
а также prepareForSegue
, но я просто не понимаю, что я должен добавить и как. Часть проблемы в том, что новичок в Swift. Смотрите ниже подробности и мой код. Дайте мне знать, если вам нужно больше деталей. Любая помощь будет принята с благодарностью. Также хотелось бы ссылку на некоторые полезные материалы для чтения на эту тему, если вы знаете что-либо. В дополнение к файлам ниже, у меня также есть один для создания поста (PostMovieVC.swift) и один для моей пользовательской ячейки (MovieCell.swift).
ViewController.swift
import UIKit
import CoreData
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
@IBOutlet weak var tableView: UITableView!
var movies = [Movie]()
var storeMovieTitle: String!
override func viewDidLoad() {
super.viewDidLoad()
tableView.delegate = self
tableView.dataSource = self
}
override func viewDidAppear(animated: Bool) {
fetchAndSetResults()
tableView.reloadData()
}
func fetchAndSetResults() {
let app = UIApplication.sharedApplication().delegate as! AppDelegate
let context = app.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: "Movie")
do {
let results = try context.executeFetchRequest(fetchRequest)
self.movies = results as! [Movie]
} catch let err as NSError {
print(err.debugDescription)
}
}
func numberOfSectionsInTableView(tableView: UITableView) -> Int {
return 1
}
func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell {
if let cell = tableView.dequeueReusableCellWithIdentifier("MovieCell") as? MovieCell {
let movie = movies[indexPath.row]
cell.configureCell(movie)
return cell
} else {
return MovieCell()
}
}
func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let movie = movies[indexPath.row]
}
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
if segue.identifier == "ShowMovieDetail" {
let detailsVC = segue.destinationViewController as! MovieDetailsVC
let indexPath = tableView.indexPathForSelectedRow!
let movie = movies[indexPath.row]
detailsVC.passedTitle = storeMovieTitle
}
}
func tableView(tableView: UITableView, heightForRowAtIndexPath indexPath: NSIndexPath) -> CGFloat {
return 169.0
}
func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
return movies.count
}
}
MovieDetailsVC.swift
import UIKit
import CoreData
class MovieDetailsVC: UIViewController {
@IBOutlet weak var showMovieImg: UIImageView!
@IBOutlet weak var showTitleLbl: UILabel!
@IBOutlet weak var showSeenWithLbl: UILabel!
@IBOutlet weak var showQuoteLbl: UILabel!
@IBOutlet weak var showLinkLbl: UILabel!
var passedMovieImg: UIImageView!
var passedTitle: String?
var passedSeenWith: String?
var passedQuote: String?
var passedLink: String?
override func viewDidLoad() {
super.viewDidLoad()
}
override func viewWillAppear(animated: Bool) {
showMovieImg.image = passedMovieImg
showTitleLbl.text = passedTitle
showSeenWithLbl.text = passedSeenWith
showQuoteLbl.text = passedQuote
showLinkLbl.text = passedLink
}
@IBAction func closeBtnTapped(sender: AnyObject) {
dismissViewControllerAnimated(true, completion: nil)
}
}
2 ответа
Моя проблема была решена путем обновления моего кода следующим образом:
Обновлен функционал prepareForSegue следующим образом:
override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
// get the segue identifier
if segue.identifier == "ShowMovieDetail" {
// get a reference for the destination view controller and the selected cell indexPath
if let MovieDetailsVC = segue.destinationViewController as? MovieDetailsVC, let indexPath = tableView.indexPathForSelectedRow {
let movie = movies[indexPath.row]
MovieDetailsVC.movie = movie
}
}
}
Удален следующий код из MovieDetailsVC:
var passedMovieImg: UIImageView!
var passedTitle: String?
var passedSeenWith: String?
var passedQuote: String?
var passedLink: String?
Заменено выше с:
var movie: Movie?
Обновлен viewWillAppear следующим образом:
override func viewWillAppear(animated: Bool) {
showMovieImg.image = movie?.getMovieImg()
showTitleLbl.text = movie!.title
showSeenWithLbl.text = movie!.seenwith
showQuoteLbl.text = movie!.quote
showLinkLbl.text = movie!.trailer
}
В файле detailVC вы объявляете одну переменную типа массив или словарь, инициализируете этот массив в табличном представлении и делали это в ViewController, в viewdidload moviewdetailvc вы можете использовать эти детали