使用 Swift 从 UITableView 捕获多个值

Posted

技术标签:

【中文标题】使用 Swift 从 UITableView 捕获多个值【英文标题】:Capturing multiple values from UITableView with Swift 【发布时间】:2017-04-18 18:58:44 【问题描述】:

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

我只需要知道如何为Key = "players" 保存多个值。非常感谢任何关于如何/在我的代码中执行此操作的建议。

如果我可以提供更多信息,请告诉我。

我真的找不到任何东西可以在这里或网上其他地方回答这些问题。我认为这可能相关,但我无法将其转化为我的需求:Saving multiple values from a UITableView

【问题讨论】:

【参考方案1】:

我只需要知道如何为Key = "players" 保存多个值。

当出现问题时,请务必阅读您正在使用的方法的文档。 NSManagedObject.setValue(:forKey:) 的文档指出:

如果 key 标识一对一关系,则将 value 指定的对象与接收者相关联,如果存在则取消先前相关的对象。给定一个集合对象和一个标识一对多关系的键,将集合中包含的对象与接收者相关联,如果有的话,取消之前相关的对象。

因此,只要您可以构建和维护您选择的 NSManagedObjects 的 Set(Core Data 使用集合来存储多对多关系),您就可以简单地按照以下方式进行操作:

selectedObjects = [NSManagedObject]() // Fill this Array
parent.setValue(Set(selectedObjects), forKey: "key")

它会自动重置一对多关系,添加任何新项目并减去新集合中未包含的任何项目。

看起来您正在维护一个selectedIndexPaths 数组。在这种情况下,您可以这样做:

selectedIndexPaths.map  playerPickerData[$0.row] 

获取选定的对象,假设您的表格视图有一个部分。然后,您需要将其转换为Set,如上所示。您也可以首先将选定的索引路径作为一个集合收集,但在您映射它之后,它将再次成为Array

PS

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

【讨论】:

好的 - 很好地填充了我的数组(谢谢),但在运行时抛出异常,因为它说一对多关系需要一个 NSSet。错误:对多关系的值类型不可接受:属性 =“玩家”;所需类型 = NSSet。有什么建议吗? 我很抱歉。由于文档的措辞,我曾假设 Arrays 会起作用,但显然不是。我更新了我的答案。 完美!非常感谢您的帮助马修。真的很感激。

以上是关于使用 Swift 从 UITableView 捕获多个值的主要内容,如果未能解决你的问题,请参考以下文章

Swift 3.0 无法从 UITableView 中删除一行

从字典数组 Swift 中填充 UITableView

如何从具有多个单元格原型的 UITableView 中捕获单元格数据?

Swift UITapRecognizer 从 UITableView 窃取水龙头

从Swift中的另一个类刷新UITableView

如何从 Swift 中嵌入 UITableView 的文本字段中检索数据?