最近,我正在学习Swift中的CoreData。我的目的是将类“AllContactTableViewController”中的一个对象“editContact”的值发送为下面的代码。
override func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
let appDelegate:AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
let managedObjectContext:NSManagedObjectContext = appDelegate.managedObjectContext!
let entity = NSEntityDescription.entityForName("Contact", inManagedObjectContext: managedObjectContext)
var request = NSFetchRequest(entityName: "Contact")
request.returnsObjectsAsFaults = false
var results: NSArray = managedObjectContext.executeFetchRequest(request, error: nil)!
let editContactView : EditContactTableViewController = EditContactTableViewController()
var editContact : Contact = results.objectAtIndex(indexPath.row) as Contact
editContactView.editContact = editContact
println("\(editContactView.editContact)")
}
到另一个名为“EditContactTableViewController”的视图控制器(如下面的代码所示)
class EditContactTableViewController: UITableViewController {
var editContact : Contact!
override func viewDidLoad() {
super.viewDidLoad()
firstNameField.text = self.editContact.firstName
lastNameField.text = self.editContact.lastName
phoneField.text = self.editContact.phone
emailField.text = self.editContact.email
companyField.text = self.editContact.company
addressField.text = self.editContact.address
}
}
然后它导致错误为“致命错误:在打开可选值时意外发现nil”
在日志中。似乎此类中名为“editContact”的对象的值已更改为nil。
你知道如何解决这个问题吗?
答案 0 :(得分:0)
首先,使用NSFetchedResultsController
。有许多优点,您也可以安全地获得所需的对象
self.fetchedResultsController.objectAtIndexPath(indexPath)
如果您的联系人显示在单元格中,则您必须已经提取了该联系人。因此再次获取它没有任何意义。你还有一个未使用的变量(实体)在你非常详细但不必要的代码中。
最好的方法是在从单元格到编辑控制器的故事板中使用segue。然后,您可以在prepareForSegue
中设置对象。
一个不错的设置是子类化表视图单元格并为其提供类型为Contact
的属性。单元格中的属性显示可以由子类处理,帮助您整理表视图控制器。然后,您可以从prepareForSegue
参数中轻松检索sender
中的对象。