从选择TableView单元格中加载的ios Swift ViewController丢失参考

时间:2016-02-20 16:39:45

标签: ios swift uitableview core-data iboutlet

此分支的完整代码here

当选择单元格时,视图控制器“MovieDetailsVC”将显示给导航控制器。

呈现视图控制器“ViewController”存储tableView的行,以NSUserDefaults的形式显示为Int。

“MovieDetailsVC”读取行ok。然后,它从CoreData中提取整个自定义类信息数组,并将数组行存储在属性中。

首先显示数据正常。 IBOutlet连接设置正常。我已断开并重新连接两次MovieDetailsVC上的所有插座,所以这应该没问题。

“viewDidLoad”被称为连续时间。不确定从哪里来。当它被调用时,coredata实体和行号被拉出来。

问题出在“lblTitle.text = self.movi​​eRecord.title”行。我假设任何IBOutlets都会导致同样的问题。

如果没有连接插座,您会看到错误:

致命错误:在打开可选值时意外地喜欢零。

MovieDetailsVC的代码如下。任何想法为什么这个出口链接将在工作正常后中断将非常感激。

import UIKit
import CoreData

class MovieDetailsVC: UIViewController {

@IBOutlet var lblTitle: UILabel!
@IBOutlet var lblDescr: UILabel!
@IBOutlet var lblLink: UILabel!
@IBOutlet var imgMovie: UIImageView!


var movieRecord:FavMovie!

var favMovies = [FavMovie]()

override func viewDidLoad() {
    super.viewDidLoad()

    fetchAndSetResult()

}

func fetchAndSetResult() {


    let app = UIApplication.sharedApplication().delegate as! AppDelegate
    let context = app.managedObjectContext
    let fetchRequest = NSFetchRequest(entityName: "FavMovie")

    do {
        let results = try context.executeFetchRequest(fetchRequest)
        self.favMovies = results as! [FavMovie]
    } catch let err as NSError {
        print(err.description)
    }

    if let row = NSUserDefaults.standardUserDefaults().objectForKey("movieRow") as? Int {

        self.movieRecord = self.favMovies[row]

        configureCellDescr()

    }


}

func configureCellDescr() {
    lblTitle.text = self.movieRecord.title
    lblDescr.text = self.movieRecord.descrWhyGood
    lblLink.text = self.movieRecord.linkImdb
    imgMovie.image = self.movieRecord.getImg()
}

}

1 个答案:

答案 0 :(得分:1)

我只是看看github中的源代码并找到问题所在。有两个问题,我将在下面解释。

  

这是第二次应用覆盖viewdidload

你的代码调用viewDidLoad方法两次的原因是你的storyboard中有一个segue将tableViewCell连接到movieDetailVC。单击单元格后,将显示movieDetailVC。

在didSelectCell方法的代码中,您创建另一个movieDetailVC对象并显示它。

因此,当您单击单元格时,实际上movieDetailVC将呈现两次。这导致了这个问题。

  

任何想法为什么这个出口链接会在工作正常后中断,将非常感谢

IBOutlet为零的原因是因为您在代码中呈现movieDetailVC的方式。您可以使用:let movieDetailsVC = MovieDetailsVC()创建movieDetailVC对象。这样做,IBOutlets将无法正确连接,因为ios不知道故事板信息。

创建MovieDetailVC对象的正确方法是从storyboard实例化。有关差异,请参阅this帖子。

<强>解决方案

您的代码设计有一个非常简单的解决方案:

从ViewController类中删除let movieDetailsVC = MovieDetailsVC()self.navigationController?.presentViewController(movieDetailsVC, animated: true, completion: nil)。由于您将选择数据保存在NSUserDefault中,因此单元格segue将显示movieDetailVC,您的movieDetailVC也可以从userDefault获取选择数据。