【发布时间】:2018-07-09 10:48:16
【问题描述】:
我需要帮助 - 我想通过关系将 tableView 中的多个选定行存储到一个实体中)
假设我有这个: 核心数据模型: Entity_1 = 包 Entity_2 = 物品
用户可以为洞家庭创建“Bagmanymaby 袋子”和他想要放入 selectet 袋子的“物品”。因此,如果家庭去度假,每个家庭成员都有自己的袋子,里面有一些物品。有些物品会在每个“包”中(如果用户选择它们。)
Bags (for):
- Carol
- Bens
- Eva
Items:
- toothbrush
- towel
- shoes
- hairbrush
- makeup
--> 我知道只将一个项目存储到每个实体中的方法(通过关系)。但我需要帮助在选定的“包”中一次存储多个项目
本只想拿起:牙刷和毛巾 Carol 拿起所有 5 件物品 Eva 选择牙刷、化妆品和鞋子
如果我打开 tableViewController 列出所有项目: 我必须将所有选定的项目存储到一个数组中,然后将该数组存储到 coredata。谁能给我一段代码?谢谢你帮助我。
FetchesResultsController:
lazy var fetchedResultsCtrl: NSFetchedResultsController<Item> = {
let request: NSFetchRequest<Item> = Item.fetchRequest()
let sort = NSSortDescriptor(key: "itemName", ascending: true)
//let catSort = NSSortDescriptor(key: "kategorie", ascending: true)
request.sortDescriptors = [sort]
let fetchedCtrl = NSFetchedResultsController(fetchRequest: request, managedObjectContext: self.managedContext, sectionNameKeyPath: nil, cacheName: nil)
// an UserDefaults binden o.ä.:
//NSFetchedResultsController.deleteCache(withName: "kategorieCache")
fetchedCtrl.delegate = self
return fetchedCtrl
}()
表格视图:
override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = tableView.dequeueReusableCell(withIdentifier: reuseIdentifier, for: indexPath) as! detailsInterieur
let items = fetchedResultsCtrl.object(at: indexPath)
cell.nameLabel?.text = items.itemName
if let paths = tableView.indexPathsForSelectedRows {
if (paths.contains(indexPath)){
cell.accessoryType = .checkmark
}
else {
cell.accessoryType = .none
}
}
else{
cell.accessoryType = .none
}
cell.selectionStyle = .none
return cell
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print("select")
}
override func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
print("deselect")
}
编辑: 我可以使用以下代码找到选择:
guard let selectedRows = tableView.indexPathsForSelectedRows else {
return
}
这些函数是自动生成的。但是我怎样才能以正确的方式使用它们呢?
@objc(addBag_RELObject:)
@NSManaged public func addToBag_REL(_ value: MyBag)
@objc(removeBag_RELObject:)
@NSManaged public func removeFromBag_REL(_ value: MyBag)
@objc(addBag_REL:)
@NSManaged public func addToBag_REL(_ values: NSSet)
@objc(removeBag_REL:)
@NSManaged public func removeFromBag_REL(_ values: NSSet)
@objc(addItem_RELObject:)
@NSManaged public func addToItem_REL(_ value: Item)
@objc(removeItem_RELObject:)
@NSManaged public func removeFromItem_REL(_ value: Item)
@objc(addItem_REL:)
@NSManaged public func addToItem_REL(_ values: NSSet)
@objc(removeitem_REL:)
@NSManaged public func removeFromitem_REL(_ values: NSSet)
【问题讨论】:
-
您的数据模型中是否设置了
Bag和Item之间的关系?如果这样做了,则只需在 Bags 对象上调用正确的方法即可,例如myBag.addToItems(myItem) -
嗨,是的,我做到了 - bag(to one) 和 item(to many) 之间存在关系
-
对我来说,这听起来更像是一种多对多的关系,因为您不会为每个包创建新项目,而是在将它们添加到包时从现有项目中进行选择。无论如何只需将所有 Item 对象添加到选定的包并保存您的上下文。
标签: ios swift core-data relationship