在Core Data关系中添加子对象 - Swift4

时间:2017-11-24 18:51:17

标签: ios swift core-data uicollectionview one-to-many

我有两个实体,一个名为Cupboard one Drawer,带有一对多关系橱柜< - >>抽屉。对于Cupboards,我使用了collectionView,我创建了一个segView到tableView(抽屉)。但是当我在DrawerViewController

时,我不知道如何将新抽屉添加到橱柜中

我像这样保存我的橱柜:

func saveCupboard(name: String, type: String){
    let cupboard = NSEntityDescription.insertNewObject(forEntityName: "Cupboard", into: managedContext) as! Cupboard

    cupboard.name = name
    cupboard.type = type

    saveContext()

}

lazy var managedContext: NSManagedObjectContext = {

    var context = NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)

    context.persistentStoreCoordinator = self.storeCoordinator

    return context
}()

func saveContext() {
    if managedContext.hasChanges {
        do {
            try managedContext.save()
        } catch {
            print(error.localizedDescription)
        }
    }
}

我的声音:

    override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "showDrawer" {
        let dst = segue.destination as! DrawerViewController

        guard let indexPath = collectionView.indexPathsForSelectedItems else{
            return
        }
        dst.cupboard = ??
    }
}

也许有人可以帮助我。 提前谢谢

修改

 lazy var fetchedResultsCtrl: NSFetchedResultsController<Cupboard> = {
    let request: NSFetchRequest<Cupboard> = Cupboard.fetchRequest()

    let sort = NSSortDescriptor(key: "name", ascending: true)

    request.sortDescriptors = [sort]

    let fetchedCtrl = NSFetchedResultsController(fetchRequest: request, managedObjectContext: appDelegate.coreDataResource.managedContext, sectionNameKeyPath: nil, cacheName: nil)

    fetchedCtrl.delegate = self

    return fetchedCtrl
}()

2 个答案:

答案 0 :(得分:1)

  

但是当我在DrawerViewController

中时,我不知道如何将新抽屉添加到橱柜中

确保已为托管对象模型启用了类生成。然后你有抽屉和橱柜类。所以你会说:

let drawer = Drawer(context:context)
drawer.cupboard = // ... the cupboard we already saved  

答案 1 :(得分:1)

override func prepare(for segue: UIStoryboardSegue, sender: Any?) {

    if segue.identifier == "showDrawer" {
        let dst = segue.destination as! DrawerViewController

        guard let indexPath = collectionView.indexPathsForSelectedItems else{
            return
        }
        dst.cupboard = cupboards[indexPath.row] as! Cupboard //Pass the cupboard to DrawerViewController.
    }
}

您可以将橱柜传递给上面的DrawerViewController。然后在DrawerViewController中添加新抽屉时,您必须设置

let newDrawer = Drawer(context:moc) 
newDrawer.cupboard = cupboard

由于橱柜和抽屉之间存在一对多的关系。