簡體   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