使用 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 指定的对象与接收者相关联,如果存在则取消先前相关的对象。给定一个集合对象和一个标识一对多关系的键,将集合中包含的对象与接收者相关联,如果有的话,取消之前相关的对象。
因此,只要您可以构建和维护您选择的 NSManagedObject
s 的 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 中删除一行
如何从具有多个单元格原型的 UITableView 中捕获单元格数据?