使用Swift

时间:2017-04-18 18:58:44

标签: swift xcode uitableview core-data

我正在尝试使用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

1 个答案:

答案 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

PS

请注意,在Array中,您将选定的索引路径添加到didSelectRow,但您永远不会将其从selectedIndexPaths中的selectedIndexPaths删除。