将一个对象从一个viewcontroller传递到另一个viewcontroller在swift中得到了nil

时间:2014-10-20 15:06:04

标签: ios objective-c core-data

最近,我正在学习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。

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

1 个答案:

答案 0 :(得分:0)

首先,使用NSFetchedResultsController。有许多优点,您也可以安全地获得所需的对象

self.fetchedResultsController.objectAtIndexPath(indexPath)

如果您的联系人显示在单元格中,则您必须已经提取了该联系人。因此再次获取它没有任何意义。你还有一个未使用的变量(实体)在你非常详细但不必要的代码中。

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

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