我有一个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
}
}
}
}
感谢您的帮助。
答案 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
}