2015-01-21 4 views
2

Простое приложение начинается с представления таблицы в навигационном контроллере с кнопкой добавления. Кнопка «Добавить» открывает новое представление с текстовыми полями, нажатие кнопки «Сохранить» возвращает вас к (обновленному) представлению таблицы. Моя проблема в том, когда я пытаюсь сохранить MOC, ничего не происходит, и приложение падает на это в отладчике:Swift Управляемый объект Контекст Сохранение сбой

First name is: John 
Last name is: Doe 
Phone number is: 123456789 
Before Save 
(lldb) 

и (**** является линия она падает на)

libswiftCore.dylib`swift_dynamicCastClassUnconditional: 
0x10c385860: pushq %rbp 
0x10c385861: movq %rsp, %rbp 
0x10c385864: testq %rdi, %rdi 
0x10c385867: je  0x10c38589e    ; swift_dynamicCastClassUnconditional + 62 
0x10c385869: movabsq $-0x7fffffffffffffff, %rax 
0x10c385873: testq %rax, %rdi 
0x10c385876: jne 0x10c38589e    ; swift_dynamicCastClassUnconditional + 62 
0x10c385878: leaq 0xb52e9(%rip), %rax 
0x10c38587f: movq (%rax), %rax 
0x10c385882: andq (%rdi), %rax 
0x10c385885: nopw %cs:(%rax,%rax) 
0x10c385890: cmpq %rsi, %rax 
0x10c385893: je  0x10c3858ad    ; swift_dynamicCastClassUnconditional + 77 
0x10c385895: movq 0x8(%rax), %rax 
0x10c385899: testq %rax, %rax 
0x10c38589c: jne 0x10c385890    ; swift_dynamicCastClassUnconditional + 48 
0x10c38589e: leaq 0x36b7d(%rip), %rax  ; "Swift dynamic cast failed" 
0x10c3858a5: movq %rax, 0xb4c0c(%rip)  ; gCRAnnotations + 8 
0x10c3858ac: int3 
****0x10c3858ad: movq %rdi, %rax 
0x10c3858b0: popq %rbp 
0x10c3858b1: retq 
0x10c3858b2: nopw %cs:(%rax,%rax) 

Вот моя функция сохранения:

@IBAction func save() { 

    if let moc = (UIApplication.sharedApplication().delegate as AppDelegate).managedObjectContext { 

     employee = NSEntityDescription.insertNewObjectForEntityForName("Employee", inManagedObjectContext: moc) as Employee 
     contact = NSEntityDescription.insertNewObjectForEntityForName("Contact", inManagedObjectContext: moc) as Contact 
     employee.contact = contact 

     //println("First name is: " + employee.contact.firstName) 
     employee.contact.firstName = firstNameTextField.text 
     println("First name is: " + employee.contact.firstName) 

     employee.contact.lastName = lastNameTextField.text 
     println("Last name is: " + employee.contact.lastName) 

     employee.contact.phoneNumber = phoneNumberTextField.text 
     println("Phone number is: " + employee.contact.phoneNumber) 

     var e: NSError? 
     println("Before Save") 
     if moc.save(&e) != true { 
      println("After Save") 
      println("insert error: \(e!.localizedDescription)") 
      return 
     } 
     println("After Save") 

    // Execute the unwind segue and go back to the home screen 
    performSegueWithIdentifier("unwindToHomeScreen", sender: self) 

} 

UPDATE

Наймите й Класс:

import Foundation 
import CoreData 

class Employee: NSManagedObject { 

    @NSManaged var wage: NSNumber 
    @NSManaged var socialInsuranceNumber: NSNumber 
    @NSManaged var contact: Contact 

} 

Контакта Класс:

import Foundation 
import CoreData 

class Contact: NSManagedObject { 

    @NSManaged var firstName: String 
    @NSManaged var lastName: String 
    @NSManaged var phoneNumber: String 
    @NSManaged var employee: NSManagedObject 

} 
+0

Пожалуйста, покажите подклассы Employee и Contact управляемых объектов. –

+0

Отредактировано соответственно – jjatie

+0

Почему у вас есть переменная сотрудника в вашем Contact-Classic? Вы нигде не устанавливаете его. Удалите его и повторите попытку. – Christian

ответ

3

Я был в состоянии воспроизвести ваше сообщение об ошибке. Вы получаете это сообщение, потому что не правильно задали имя класса сущности в редакторе модели основных данных.

Определите поля имени класса сущности в редакторе модели основных данных как <MyAppName>.Employee и <MyAppName>.Contact.

См. Это previous answer для получения более подробной информации. Вы также можете узнать больше о Core Data и пространствах имен here.

+0

Нечетные. Я сделал это, но содержал пробелы, поэтому я заменил их на «_» (также попробовал «-», как в UNIX). Переименование MyApp не содержит пробелов. Будет ранга, когда у меня будет достаточно репутации. Спасибо вам большое за ваше время. – jjatie

0

Вы не можете бросить NSManagedObject к классу.

Вы должны сделать это так:

employee = NSEntityDescription.insertNewObjectForEntityForName("Employee", inManagedObjectContext: moc) as NSManagedObject 

Затем, вы можете получить доступ к атрибутам с valueForKey -метода.

Также вы можете создать класс NSManagedObject. Таким образом, можно было бы отнести его к этому классу.

#import <Foundation/Foundation.h> 
#import <CoreData/CoreData.h> 

@interface Employee: NSManagedObject 

@property (nonatomic, retain) NSString* firstName; 
@property (nonatomic, retain) NSString* lastName; 
@property (nonatomic, retain) NSString* phoneNumber; 

@end 

доступа:

employee = NSEntityDescription.insertNewObjectForEntityForName("Employee", inManagedObjectContext: moc) as Employee 
+0

Обновлено, чтобы показать подклассы NSManagedObject – jjatie

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