Передача значений из 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 вы можете использовать эти детали

Другие вопросы по тегам