2014-10-20 146 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中的對象。

相關問題