2016-02-20 2 views
0

Полный код для этой отрасли hereИОС Swift ViewController Loaded от Выбор Tableview Cell Теряет Reference

Посмотреть контроллер «MovieDetailsVC» представлен навигации контроллера при выборе ячейки.

Контроллер представления представления, «ViewController», сохраняет строку tableView для отображения в NSUserDefaults как Int.

"MovieDetailsVC" читает строку ok. Затем он извлекает весь массив информации о пользовательских классах из CoreData и сохраняет строку массива в свойстве.

Сначала данные отображаются нормально. Соединения IBOutlet настроены нормально. Я отключил и повторно подключил два выхода на MovieDetailsVC, так что это должно быть нормально.

"viewDidLoad" называется последовательным временем. Не уверен, откуда. Когда он вызывается, объект coredata и номер строки вытягиваются в порядке.

Вопрос находится в строке «lblTitle.text = self.movieRecord.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() 
} 

} 
+0

Вы имеете в виду, что коды в методе configureCellDescr() вызывают ошибку. Если вы не знаете, какая строка кода вызывает ошибку, вы должны добавить контрольную точку исключения для ее отслеживания. – Surely

+0

Отредактировано, чтобы показать строку, в которой происходит сбой кода. –

+0

Извините, отредактировано, чтобы показать ошибку перевода строки –

ответ

1

Я просто взгляну на ваш исходный код в github и найду проблему. Есть два вопроса, и я объясню это ниже.

it does that the second time that the app overrides viewdidload

Причина того, что ваш код будет вызывать метод viewDidLoad в два раза, потому что у вас есть SEGUE в раскадровку, которая соединит tableViewCell к movieDetailVC. Это будет показано movieDetailVC после нажатия на ячейку.

И в вашем коде для метода didSelectCell вы создаете еще один объект movieDetailVC и представляете его.

Так что на самом деле movieDetailVC будет отображаться дважды, когда вы нажимаете на ячейку. Это вызывает проблему.

Any ideas why this outlet link would break after working ok would be greatly appreciated

Причина IBOutlet равна нулю из-за того, как вы представить movieDetailVC в вашем коде. Вы создаете объект movieDetailVC, используя: let movieDetailsVC = MovieDetailsVC(). Выполняя это так, IBOutlets не будут подключены правильно, потому что ios не знают о информации раскадровки.

Правильный способ создания объекта MovieDetailVC заключается в создании экземпляра из раскадровки. См. Сообщение this для разницы.

Решение

Существует очень простое решение для вашего дизайна кода:

просто удалить let movieDetailsVC = MovieDetailsVC() и self.navigationController?.presentViewController(movieDetailsVC, animated: true, completion: nil) из вашего класса ViewController.Поскольку вы сохраняете данные выбора в NSUserDefault, ячейка segue будет представлять movieDetailVC, и ваш movieDetailVC также может получить данные выбора из userDefault.

+0

и я прошу прощения прошлой ночью, я пошел спать после публикации комментария :) – Surely

Смежные вопросы