繁体   English   中英

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

[英]ios Swift ViewController Loaded from Selecting TableView Cell Loses Reference

此分支的完整代码在这里

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

呈现的视图控制器“ ViewController”存储要在NSUserDefaults中显示为Int的tableView的行。

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

首先,数据显示正常。 IBOutlet连接设置正确。 我已断开连接,并重新连接了MovieDetailsVC上所有插座的两次,因此应该可以。

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

问题在“ lblTitle.text = self.movi​​eRecord.title”行中。 我假设任何IBOutlets都会引起相同的问题。

如果未连接插座,则会看到错误:

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

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()
}

}

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

它确实是应用程序第二次覆盖viewdidload

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

在didSelectCell方法的代码中,创建另一个movieDetailVC对象并将其呈现。

因此,当您单击单元格时,movieDetailVC实际上会显示两次。 这导致问题。

任何想法为什么此出口链接会在正常工作后中断

IBOutlet为nil的原因是因为您在代码中呈现movieDetailVC的方式。 使用以下方法创建movieDetailVC对象: let movieDetailsVC = MovieDetailsVC() 这样,由于ios不知道情节提要信息,因此IBOutlets将无法正确连接。

创建MovieDetailVC对象的正确方法是从情节提要实例化。 看到这篇文章的区别。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM