使用Swift从UITableView捕获多个值

使用Swift从UITableView捕获多个值,swift,xcode,uitableview,core-data,Swift,Xcode,Uitableview,Core Data,我尝试使用uitableview作为选择器,以允许用户进行多项选择。我已将tableview设置为允许此操作,并且我的coreData具有一对多关系以允许多个值。我的问题是,我无法找出如何在coreData中将所选行捕获为值 我通过从我的“玩家”实体获取数据并将其存储在此变量中来填充表: var playerPickerData = [NSManagedObject]() 我猜我需要使用selectedrowsatindexpaths函数来提取playerPickerData中的值,然后才能将

我尝试使用uitableview作为选择器,以允许用户进行多项选择。我已将tableview设置为允许此操作,并且我的coreData具有一对多关系以允许多个值。我的问题是,我无法找出如何在coreData中将所选行捕获为值

我通过从我的“玩家”实体获取数据并将其存储在此变量中来填充表:

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。有什么建议吗?我道歉。由于文档的措辞,我假设数组可以工作,但显然不行。我更新了我的答案。完美!非常感谢你的帮助,马修。非常感谢。