我需要帮助-我想通过关系将tableView中的多个选定行存储到一个实体中
让我说: CoreData模型: 实体_1 =包 Entity_2 =物品
用户可以创建“小孔系列手提袋”和“物品”,然后将其放入“选择袋”中。因此,如果该家庭度假,则每个家庭成员都有自己的手提袋,其中装有一些物品。在每个“包”中(如果用户选择了它们)。
Bags (for):
- Carol
- Bens
- Eva
Items:
- toothbrush
- towel
- shoes
- hairbrush
- makeup
->我知道仅将一个项目存储到每个实体(通过关系)的方法。但是我需要帮助才能一次将多个项目存储在选定的“包”中
Ben只想拿起:牙刷和毛巾 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
}()
TableView:
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)
答案 0 :(得分:3)
根据您的情况,包实体上的项目应为多个关系。在这种情况下,您的 Bag 的NSMangedObject
类或其扩展名(取决于您在 codegen 中选择的内容)应该已生成方法@NSManaged public func addToItems(_ values: NSSet)
。
您可以从 tableView的变量 indexPathsForSelectedRows
中获取选定的项目,生成 Items 并通过调用addToItems(:)
将它们添加到您的 bag 对象中
但是更好的方法是明智地使用 CoreData 。在您的情况下,物品将具有bag
属性(根据关系),因此当您创建物品并为其分配有效的袋子< / strong>对象,它将自动更新关系的另一端。
答案 1 :(得分:2)
假设您已经在selectedRow
中选择了项目,并且您当前选择的购物袋具有某些属性,请说selectedBag
,然后
guard let selectedRows = tableView.indexPathsForSelectedRows else {
return
}
for path in selectedRows {
let item = fetchedResultsCtrl.object(at: path.row)
selectedBag.addToItem_REL(item)
}
然后在托管对象上下文中调用save()
。