尝试从核心数据对象

时间:2016-03-06 02:13:12

标签: swift uitableview core-data nsfetchedresultscontroller

我有一个UITableView,它使用NSFetchedResultsController来获取UITableView的数据。当用户在UITableView中选择一行时,我有一个编辑模式视图向上滑动,带有两个UITextField,供用户编辑UITableViewCell中的数据。我想要完成的是使用Core数据中UITableViewCell中的文本设置每个UITextField的文本。我这样做是为了使用户不必为了进行编辑而重新输入他们的数据。

问题是当我尝试在prepareForSegue中为每个UITextField设置文本时,我收到一个致命错误“在展开Optional值时意外地发现了nil”。我知道数据存在,所以我不确定它为什么找到零。当我使用NSFetchedResultsController时,我跟着this stackoverflow帖子正确编写了我的prepareForSegue函数。这是我的代码:

    override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
       if segue.identifier == "edit" {
        if let inputController = segue.destinationViewController as? QAInputViewController {
            let uri = currentDeck!.objectID.URIRepresentation()
            let objectID = managedContext.persistentStoreCoordinator?.managedObjectIDForURIRepresentation(uri)
            inputController.currentDeck = managedContext.objectWithID(objectID!) as? Deck
            if let indexPath = tableView.indexPathForCell(sender as! DisplayTableViewCell) {
                let data = fetchedResultsController.objectAtIndexPath(indexPath) as? Card
                inputController.questionInput.text = data?.question
                inputController.answerInput.text = data?.answer
            }

        }

    }

}

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

我发现我的崩溃发生了,因为在尝试为每个UITextField分配文本时,我的目标视图控制器的视图尚未加载。

所以我在目标视图控制器中添加了两个String类型的变量来保存prepareForSegue函数中的数据,而不是尝试将所选UITableView行中的文本直接分配给UITextField,然后在viewWillAppear中我将这些变量分配给每个的UITextField。

  override func prepareForSegue(segue: UIStoryboardSegue, sender: AnyObject?) {
      if segue.identifier == "edit" {
        if let inputController = segue.destinationViewController as? QAInputViewController {
            let uri = currentDeck!.objectID.URIRepresentation()
            let objectID = managedContext.persistentStoreCoordinator?.managedObjectIDForURIRepresentation(uri)
            inputController.currentDeck = managedContext.objectWithID(objectID!) as? Deck
        if let indexPath = tableView.indexPathForCell(sender as! DisplayTableViewCell) {
            let data = fetchedResultsController.objectAtIndexPath(indexPath) as? Card
                inputController.selectedQuestion = data!.question
                inputController.selectedAnswer = data!.answer
         }
      }
   }
}

在我的目标视图控制器中:

var selectedQuestion: String = ""
var selectedAnswer: String = ""

override func viewWillAppear(animated: Bool) {

    questionInput.text = selectedQuestion
    answerInput.text = selectedAnswer
}