我正在尝试使用uitableview作为选择器,以允许用户进行多项选择。我已经将tableview设置为允许这个,并且我的coreData具有一对多的关系以允许多个值。我的问题是我无法弄清楚如何将所选行捕获为我的coreData中的值。
我通过从“玩家”实体获取数据并将其存储在此变量中来填充表格:
var playerPickerData = [NSManagedObject]()
我猜我需要对selectedrowsatindexpaths
函数执行某些操作,然后从playerPickerData
中提取值,以便能够将它们添加到我的'Match'实体(已链接)与我的玩家实体有一对多的关系)。
我必须填充表格单元格的代码是:
func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
let cell = playersPicker.dequeueReusableCell(withIdentifier: "cell", for: indexPath)
cell.accessoryType = cell.isSelected ? .checkmark : .none
cell.selectionStyle = .none
let fName = playerPickerData[indexPath.row].value(forKey: "firstName") as! String
let lName = playerPickerData[indexPath.row].value(forKey: "lastName") as! String
let playersNameData = "\(fName) \(lName)"
cell.textLabel?.text = playersNameData
return cell
}
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath)?.accessoryType = .checkmark
selectedIndexPaths.append(indexPath as NSIndexPath)
}
func tableView(_ tableView: UITableView, didDeselectRowAt indexPath: IndexPath) {
tableView.cellForRow(at: indexPath)?.accessoryType = .none
}
我有一个用于选择一个值('游戏名称')的UIPickerView,我可以通过在我的SavePressed函数上使用以下内容来捕获我需要的内容而没有问题:
let newMatch = NSEntityDescription.insertNewObject(forEntityName: "Match", into: context)
let selectedGame = pickerData[gamePicker.selectedRow(inComponent: 0)]
newMatch.setValue(selectedGame, forKey: "game")
我只需要知道如何为Key =“players”保存多个值。非常感谢我在代码中如何/在何处执行此操作的任何建议。
如果我可以提供更多信息,请告诉我。
我真的找不到任何可以在网上或其他地方回答这些问题的内容。我认为这可能有关系,但我无法将其转化为我的需求:Saving multiple values from a UITableView
答案 0 :(得分:0)
我只需要知道如何为Key ="玩家"保存多个值。
在出现问题时,请务必阅读您正在使用的方法的文档。 NSManagedObject.setValue(:forKey:)
州的文件:
如果key标识了一对一关系,则将value指定的对象与接收者关联,如果存在,则与先前相关的对象无关。给定一个集合对象和一个标识多对多关系的密钥,将集合中包含的对象与接收者联系起来,如果存在,则与先前相关的对象无关。
因此,只要您可以构建和维护所选Set
的{{1}}(核心数据使用集合来存储多对多关系),您就可以执行以下操作:
NSManagedObject
它将自动重置多对多关系,添加任何新项目并减去新集合中未包含的任何内容。
看起来你正在维护一个selectedObjects = [NSManagedObject]() // Fill this Array
parent.setValue(Set(selectedObjects), forKey: "key")
数组。在这种情况下,您可以这样做:
selectedIndexPaths
获取所选对象,假设您的表视图只有一个部分。然后,您需要将其转换为selectedIndexPaths.map { playerPickerData[$0.row] }
,如上所示。您也可以首先将选定的索引路径收集为一个集合,但是在映射之后它仍将是Set
。
请注意,在Array
中,您将选定的索引路径添加到didSelectRow
,但您永远不会将其从selectedIndexPaths
中的selectedIndexPaths
删除。