2014-10-20 3 views
0

Недавно я узнал о CoreData в Swift. Моя цель - отправить значение одного объекта «editContact» в класс «AllContactTableViewController» в качестве кода ниже.Передача объекта с одного диспетчера viewController на другой viewcontroller получил нуль в swift

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)") 
} 

к другому ViewController под названием «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 

    } 
} 

тогда это вызвало ошибку как «Фатальная ошибка: неожиданно обнаружили ноль в то время разворачивания необязательное значение»

в журнал. Кажется, значение объекта, называемого «editContact» в этом классе, изменилось на nil.

У вас есть идея, как исправить эту проблему?

+1

Как вы переходите от первого контроллера табличного представления к EditContactTableViewController? – rdelmar

+0

я использовал SEGUE метод, как показано ниже: переопределение Func prepareForSegue (SEGUE: UIStoryboardSegue, отправитель: AnyObject) { , если segue.identifier == "editContact" { запроса вар = NSFetchRequest (EntityName: "Контакт") запросу .returnsObjectsAsFaults = false var indexPath: NSIndexPath = self.tableView.indexPathForSelectedRow()! пусть editContact: Контакт = results.objectAtIndex (indexPath.row) в контакт пусть editContactView: EditContactTableViewController = segue.destinationViewController в EditContactTableViewController editContactView.editContact = editContact } } –

+0

Вы не должны осуществлять как didSelectRowAtIndexPath и prepareForSegue , Если вы используете segues, вам нужно всего лишь реализовать prepareForSegue. Вы создаете новый экземпляр EditContactTableViewController в didSelectRow, что не очень хорошо. – rdelmar

ответ

0

Во-первых, используйте NSFetchedResultsController. Есть много преимуществ, и вы также будете безопасно получить нужный вам объект с

self.fetchedResultsController.objectAtIndexPath(indexPath) 

Если контакт отображается в ячейке, которую вы уже должны извлекаться его. Так что не имеет смысла приносить его снова. Также у вас есть неиспользуемая переменная (сущность) в вашем очень подробном, но ненужном коде.

Лучшим способом является использование segue в раскадровке из ячейки в контроллер редактирования. Затем вы можете настроить объект в prepareForSegue.

Одна хорошая установка заключается в подклассе ячейки представления таблицы и присвоении ей свойства типа Contact. Отображение атрибутов в ячейке может обрабатываться подклассом, помогая вам очистить контроллер табличного представления. Затем вы можете легко получить объект в prepareForSegue из параметра sender.

Смежные вопросы