2014-10-20 247 views
0

最近,我正在学习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”(如下面的代码)另一个的ViewController

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 

    } 
} 

那么它导致该错误作为“致命错误:意外地发现零而展开的可选值”

在日志。看起来这个类中名为“editContact”的对象的值已经变为零。

你知道如何解决这个问题吗?

+1

你如何从第一个表视图控制器到EditContactTableViewController? – rdelmar 2014-10-20 15:20:54

+0

我用如下方法赛格瑞: 倍率FUNC prepareForSegue(SEGUE:UIStoryboardSegue,发件人:AnyObject){ 如果segue.identifier == “editContact”{ VAR请求= NSFetchRequest(的entityName: “联系人”) 请求.returnsObjectsAsFaults = false var indexPath:NSIndexPath = self.tableView.indexPathForSelectedRow()! 让editContact:联系= results.objectAtIndex(indexPath.row)作为联系 让editContactView:EditContactTableViewController = segue.destinationViewController作为EditContactTableViewController editContactView.editContact = editContact }} 您 – 2014-10-22 08:08:50

+0

不应该同时实现didSelectRowAtIndexPath方法和prepareForSegue 。如果你使用segues,你只需要实现prepareForSegue。你正在didSelectRow中创建一个EditContactTableViewController的新实例,这个实例不好。 – rdelmar 2014-10-22 15:00:53

回答

0

首先,使用一个NSFetchedResultsController。有许多优势,也将安全得到你需要的对象,具有

self.fetchedResultsController.objectAtIndexPath(indexPath) 

如果你的联系人显示在您必须已经取出它的电池。所以再次获取它没有任何意义。你也有一个未使用的变量(实体)在你非常冗长而不必要的代码中。

最好的方法是使用从单元格到编辑控制器的故事板中的segue。然后您可以在prepareForSegue中设置对象。

一个不错的设置是将表格视图单元格子类化并赋予其类型为Contact的属性。在单元格中显示属性可以由子类处理,帮助您整理表视图控制器。然后,您可以从sender参数中轻松检索prepareForSegue中的对象。

相关问题