【问题标题】:Tableview selection stored to Core Data entity存储到核心数据实体的表格视图选择
【发布时间】:2015-08-31 15:55:18
【问题描述】:

我目前正在构建一个应用程序,该应用程序向用户显示可供选择的项目列表。我希望将这些选择存储到核心数据中,因为它将用于多个不同的表格视图。

现在我已经设置了核心数据模型来接收选择的布尔值以及该选择的数量。我对如何做到这一点有点迷茫,因为我能找到的所有参考资料都是 pre swift 并且 swift 是我目前阅读的唯一语言。

为了更深入地了解我有一个带有布尔属性和整数属性的实体设置,以确定该选择的选择和数量。

func tableView(tableView: UITableView, didDeselectRowAtIndexPath indexPath: NSIndexPath) {
    let listed = frc.objectAtIndexPath(indexPath) as! Cards
    let indexPath = cardsListed.indexPathForSelectedRow();
    let currentCell = cardsListed.cellForRowAtIndexPath(indexPath!) as UITableViewCell?
    DeckCards.setValue(true, forKey: "cardsSelected")
    managedObjectContext?.save(nil)
}

我正在考虑使用复选标记来显示哪些项目将被保存给用户......事实上,这是我想要的方式,它并没有太大变化,因为我仍然可以'找不到这样做的快速示例。 下面附上我的核心数据模型的图像,以便更好地理解: [1

【问题讨论】:

  • 感谢汤姆的编辑!抱歉,我的编辑技术很差,我应该比平时对游戏爱好者更正式。
  • 任何可以帮助我以布尔或其他方式将用户选择从 tableview 永久保存到核心数据的人都会有很大的帮助。
  • 你能再解释一下你的模型吗?从外观上看,您的表格视图使用 FRC 填充了 Cards 对象,但您正在为不同的对象 (DeckCards) 设置布尔属性。 DeckCards 是什么实体类型,它与 Cards 有什么关系?
  • DeckCards 是一个实体,它包含 2 个属性,一个为布尔值的 cardSelection 属性和一个为整数的 cardQuantity 属性。它与 Card 实体相关,该实体包含作为用户可以在多对一关系中选择的对象的对象。为了便于理解,我附上了我的核心数据模型的屏幕截图。
  • 我编辑了我最初的帖子,包括一张图片以及我正在考虑的方向。

标签: swift core-data


【解决方案1】:

我认为,鉴于 cmets 中添加的信息,您需要稍微修改您的模型:每个 DeckCards 对象应该只有一个与之相关的 Card,即 DeckCards 上的 cardsselected实体应该是“一对一”。这是因为属性cardsSelectednumberSelected 与一个特定的Card 相关,而不是它们中的一组。并且反向关系(Cards 实体上的cardselections)应该是“多对多”:每个 Card 对象可以与许多 DeckCards 对象相关。

另外,我认为DeckCardscardsSelected 属性将是多余的,可以删除:如果选择了一张卡片(对于特定的Deck),就会有一个与之相关的DeckCards 对象。而如果不选中,则不会有与之相关的DeckCards对象。

假设用户选择或创建了一个Deck 对象,我们称之为currentDeck,然后从表视图中选择要在该Deck 中使用的卡片。在您的 tableView:didSelectRowAtIndexPath: 方法中,您为所选卡片和卡片创建(或更新)DeckCards 对象。不确定如何确定 numberSelected,可能是使用警报控制器或其他视图控制器?

这样的事情(顺便说一句,请注意,在问题的代码中,您使用的是“didDeselectRow...”而不是“didSelectRow...”):

func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath) {
    var myDeckCard : DeckCards?
    let listed = frc.objectAtIndexPath(indexPath) as! Cards
    // check: is there already a DeckCards object for this Card and this Deck?
    for eachDeckCard in listed.cardselections {
        if eachDeckCard.deckcomplete == currentDeck {
            // There is already a DeckCard object for this Card and currentDeck
            myDeckCard = eachDeckCard
        }
    }
    if myDeckCard == nil {
        // There is no DeckCard object for this Card and currentDeck
        // So create one...
        myDeckCard = NSEntityDescription.insertNewObjectForEntityForName("DeckCards", inManagedObjectContext: managedObjectContext!)
        myDeckCard.cardsselected = listed
        myDeckCard.deckcomplete = currentDeck
    }
    // your code to determine numberSelected here; I'll assume 2!
    myDeckCard.numberSelected = 2
    managedObjectContext?.save(nil)
}

(上面的代码可能需要一些调整才能正确转换和解包选项,但我希望你明白要点)。

在显示为给定牌组选择的卡片的表格视图时:currentDeck.cardsselected 将为您提供一组适当的 DeckCards 对象。或者,您可以使用谓词获取DeckCards 对象,以将结果限制为正确的Deck。对于每个DeckCards 对象,您可以使用cardsselected.name (etc) 来确定对应的卡片名称(etc)。

【讨论】:

  • 哇,这可能是关于如何做某事的最详细和最好的解释之一!谢谢你,我只有一件与此相关的小事,那就是说用户想要编辑这个后记并在不同的视图控制器中更改卡片组对象我是否只需在该视图控制器上打开 MOC 并允许用户删除使用 didselectatrow 命令选择的对象。当我这样做时我还需要注意什么,因为我知道 MOCS 与每个视图控制器相关的方式在应用程序读取关系的方式上是独一无二的。
  • 我也在考虑让用户在单元格上点击 1 次 1 张卡 2 次 2 张卡,如果他们再次点击它,它会返回到一个 我可以使用相同的 didselectatrow 方法吗?
  • @Matthew 是的,使用 didSelectRow... 在每次点击时增加 numberSelected 是有意义的,循环到零以有效地取消选择。当用户取消选择时,您应该可以删除 DeckCards 对象,前提是您在其他地方没有对它的强引用。例如,如果您在一个 VC 中加载包含所有 DeckCards 对象的数组,然后转到另一个执行删除操作的位置,则需要确保更新数组以删除现在已删除的对象。
  • 好吧,是的,这是有道理的!我正忙于通过您提供的一般方式来尝试修复类型转换以及引用正在记录的对象。它是从另一个视图控制器传递的,因此提供的代码中的一些引用略有偏差,但它朝着正确的方向迈出了一大步,希望我能在接下来的几个小时内清理其余部分!
  • 我知道我已经接受了答案,但我正在尝试编写代码但仍然遇到一些问题......我想知道你是否可以像我一样帮助我澄清这部分完成所有类型转换和最终结果实际上并没有让我仍然设置对象关系。是否可以将其移至聊天室?
猜你喜欢
  • 2015-05-21
  • 2021-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-11
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
相关资源
最近更新 更多