将值从 UITableViewCell 传递到详细视图

Posted

技术标签:

【中文标题】将值从 UITableViewCell 传递到详细视图【英文标题】:Passing values from TableViewCell to Detail View 【发布时间】:2016-04-06 04:41:05 【问题描述】:

就像我筛选过的其他一些帖子一样,这里是我说我是 Swift 新手的部分。我有一个应用程序,可以让你为你最喜欢的电影存储图像和数据(通过 Core Data)。这部分工作正常。我可以创建一个新帖子并通过我的 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)




【问题讨论】:

您是否在 TableViewCell 点击时在 ViewController 和 MoviewDetailsVC 之间添加了 segue?! 您需要在 firstviewcontroller 和 details 视图控制器之间创建 segue。保存 indexPath.row ,然后在 prepareForSegue 方法中使用该索引路径行值。 忘了说,是的,我创建了一个从我的主 VC 到 MovieDetailsVC 的“显示”segue。 【参考方案1】:

通过更新我的代码解决了我的问题:

更新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

    

【讨论】:

【参考方案2】:

在movie detailVC中你声明一个数组或字典类型的变量,在ViewController的tableview didsselect中初始化该数组,在moviewdetailvc的viewdidload中你可以使用这些细节

【讨论】:

请给我反对这个答案的理由

以上是关于将值从 UITableViewCell 传递到详细视图的主要内容,如果未能解决你的问题,请参考以下文章

将值从 Objective-C 类传递给 Swift TableViewCell

将值从 BackgroundWorker DoWork 传递到 BackgroundWorker Completed

将值从 ngOnInit 传递到模板

将值从 uitableview 传递到 uicollectionview

将值从 php 传递到 modal

如何将值从 tableview 传递到 collectionview