从TableViewCell传递值到详细视图

问题描述:

与我已经过筛的其他帖子非常相似,下面是我说我是Swift新手的部分。我有一个应用程序,允许您为自己喜欢的电影存储图像和数据(通过核心数据)。这部分工作正常。我能够创建一个新的帖子,并通过我的tableViewCell查看它。我遇到问题的部分,它在单击细胞后在细节页面上显示图像和数据。从TableViewCell传递值到详细视图

我已阅读关于这个主题的其他帖子和文章,我很确定我需要使用didSelectRowAtIndexPathprepareForSegue,但我只是不理解我应该添加和如何。部分问题对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) 

} 

} 
+0

您是否在TableViewCell上的ViewController和MoviewDetailsVC之间添加了segue? – Bettimms

+0

您需要在firstviewcontroller之间创建细节视图控制器。保存indexPath.row,然后在prepareForSegue方法中使用该索引路径行值。 – vikash1307

+0

忘了提及,是的,我创建了一个从我的主VC到MovieDetailsVC的“Show”segue。 – Raden13

在电影detailVC声明类型的数组或字典中的一个变量,初始化阵列中的ViewController的tableview didsselect

,在moviewdetailvc viewdidload你可以使用这些细节

+0

Plaese给我downvoting这个答案的理由 –

更新prepareForSegue FUNC如下:

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? 

更新后的视图将出现如下内容:

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 

    }