【问题标题】:Finding nil in prepareForSegue when trying to set UITextField text from Core data object尝试从核心数据对象设置 UITextField 文本时在 prepareForSegue 中找到 nil
【发布时间】:2016-03-06 02:13:11
【问题描述】:

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

问题是当我尝试在 prepareForSegue 中为每个 UITextField 设置文本时,我收到一个致命错误“在展开可选值时意外发现 nil”。我知道数据就在那里,所以我不确定为什么它会找到零。在使用 NSFetchedResultsController 时,我按照 thisstackoverflow 帖子正确编写了我的 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
            }

        }

    }

}

感谢您的帮助。

【问题讨论】:

  • nil 是哪个变量?您是否尝试过添加异常断点来查找崩溃的行?
  • 从我检查的结果来看,它似乎在这些行上崩溃 inputController.questionInput.text = data?.question inputController.answerInput.text = data?.answer
  • 你确定是那些行吗,因为错误提到了“展开”,除非questionInputanswerInput 是隐式展开的选项并且是nil,否则错误可能不存在.你能在代码后面加上断点吗?单步执行该函数,看看它在哪里崩溃。
  • 所以我只是在 inputController.answerInput.text = data?.answer 上设置了一个断点并得到了崩溃。之前什么都好。我只是无法设置我的 UITextfields 的文本吗?基本上我只想用我的 TableView 选定行中的核心数据对象填充它们。

标签: swift uitableview core-data nsfetchedresultscontroller


【解决方案1】:

我发现我的崩溃正在发生,因为在尝试将文本分配给每个 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
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    • 2017-12-16
    相关资源
    最近更新 更多