该分支here的完整代码
选择一个单元格后,视图控制器“ MovieDetailsVC”将显示给导航控制器。
呈现的视图控制器“ ViewController”将tableView的行存储为Int形式显示在NSUserDefaults中。
“ MovieDetailsVC”读取行。然后,它从CoreData中提取整个自定义类信息数组,并将该数组行存储在一个属性中。
首先,数据显示正常。 IBOutlet连接设置正确。我已断开连接,并重新连接了MovieDetailsVC上所有插座的两次,因此应该可以。
“ viewDidLoad”称为连续时间。不知道从哪里来。调用它时,coredata实体和行号被确定为正常。
问题在“ lblTitle.text = self.movieRecord.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的方式。您可以使用let movieDetailsVC = MovieDetailsVC()
创建movieDetailVC对象。这样,由于ios不知道情节提要信息,因此IBOutlets将无法正确连接。
创建MovieDetailVC对象的正确方法是从情节提要实例化。有关差异,请参见this帖子。
解
您的代码设计有一个非常简单的解决方案:
只需从ViewController类中删除let movieDetailsVC = MovieDetailsVC()
和self.navigationController?.presentViewController(movieDetailsVC, animated: true, completion: nil)
。由于您将选择数据保存在NSUserDefault中,因此单元格序列将显示movieDetailVC,而movieDetailVC也可以从userDefault获取选择数据。
关于ios - 从选择TableView单元格丢失引用加载的iOS Swift ViewController,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/35526012/