使用Swift从UITableView捕获多个值
我尝试使用uitableview作为选择器,以允许用户进行多项选择。我已将tableview设置为允许此操作,并且我的coreData具有一对多关系以允许多个值。我的问题是,我无法找出如何在coreData中将所选行捕获为值 我通过从我的“玩家”实体获取数据并将其存储在此变量中来填充表:使用Swift从UITableView捕获多个值,swift,xcode,uitableview,core-data,Swift,Xcode,Uitableview,Core Data,我尝试使用uitableview作为选择器,以允许用户进行多项选择。我已将tableview设置为允许此操作,并且我的coreData具有一对多关系以允许多个值。我的问题是,我无法找出如何在coreData中将所选行捕获为值 我通过从我的“玩家”实体获取数据并将其存储在此变量中来填充表: var playerPickerData = [NSManagedObject]() 我猜我需要使用selectedrowsatindexpaths函数来提取playerPickerData中的值,然后才能将
var playerPickerData = [NSManagedObject]()
我猜我需要使用selectedrowsatindexpaths
函数来提取playerPickerData
中的值,然后才能将它们添加到我的“匹配”实体(该实体通过一对多关系链接到我的玩家实体)
我必须填充表格单元格的代码是:
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")
我只需要知道如何保存多个值forKey=“players”。非常感谢您在我的代码中提供有关如何/在何处执行此操作的任何建议
如果我能提供更多的信息,请让我知道
我真的无法在这里或网上其他地方找到任何答案。我认为这可能与我的需求有关,但我无法将其转化为我的需求:
我只需要知道如何保存多个值forKey=“players”
出现问题时,请务必阅读所用方法的文档。NSManagedObject.setValue(:forKey:)
的文档说明:
如果键标识了一个对一关系,则将值指定的对象与接收方关联,如果存在,则取消对先前相关对象的关联。给定一个集合对象和一个标识多对多关系的键,将集合中包含的对象与接收方关联,如果存在以前相关的对象,则取消关联
因此,只要您能够构建和维护所选NSManagedObject
的集合(核心数据使用集合来存储多个关系),您就可以简单地执行以下操作:
selectedObjects = [NSManagedObject]() // Fill this Array
parent.setValue(Set(selectedObjects), forKey: "key")
它将自动重置“多对多”关系,添加任何新项,并减去新集合中未包含的任何项
看起来您正在维护一个selectedIndexPaths
数组。在这种情况下,您可以执行以下操作:
selectedIndexPaths.map { playerPickerData[$0.row] }
若要获取选定对象,请假定表视图只有一个部分。然后,您需要将其转换为如上所示的集合。您也可以首先将选定的索引路径作为一个集合进行收集,但在映射之后,它将再次成为一个数组
附言
请注意,在您的didSelectRow
中,您将所选索引路径添加到selectedIndexPaths
,但从未从didSelectRow中的selectedIndexPaths
中删除它们-这很好地填充了我的数组(谢谢)但在运行时抛出异常,因为它表示一对多关系需要NSSet。错误:多对多关系的值类型不可接受:property=“players”;所需类型=NSSet。有什么建议吗?我道歉。由于文档的措辞,我假设数组可以工作,但显然不行。我更新了我的答案。完美!非常感谢你的帮助,马修。非常感谢。