2015-08-31 47 views
0

我目前正在構建一個應用程序,向用戶顯示可供選擇的項目列表。我希望將這些選擇存儲到核心數據中,因爲它將用於多種不同的表格視圖。存儲到核心數據實體的表格選擇

現在我有核心數據模型設置來接收選擇的布爾值以及該選擇的數量。我對於如何做到這一點有些遺憾,因爲我能找到的所有參考資料都是預先迅速而且迅速是我目前閱讀的唯一語言。

爲了更多地瞭解我有一個布爾屬性和整數屬性的實體設置,以確定選擇和數量的選擇。

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) 
} 

我用一個對勾顯示哪些項目將被保存到用戶考慮....作爲一個事實事,這是我想去的地方不在於改變很多方式我仍然無法找到這樣做的迅速例子。 以下附件是我的核心數據模型,以便更好地理解圖像: [core data model1

+0

感謝您的編輯Tom!對不起,我的編輯技巧不好,我應該比我通常在遊戲萌芽時更正式。 – Matthew

+0

任何人都可以幫助我將tableview中的用戶選擇永久保存到核心數據中,否則布爾型或其他方式將會是一大幫助。 – Matthew

+0

你能解釋一下你的模型嗎?通過外觀,您的表格視圖使用FRC填充了卡片對象,但您正在設置不同對象(DeckCards)上的布爾屬性。什麼樣的實體類型是DeckCards,它與卡片有什麼關係? – pbasdf

回答

0

我認爲,鑑於在評論中添加的信息,你需要稍微修改模型:每個DeckCards對象應該只有一個與其相關的Card,即DeckCards實體上的cardsselected應該「一對一」。這是因爲cardsSelectednumberSelected屬性與一個特定的Card有關,而不是其中的一組。而且相反的關係(Cards實體上的cardselections)應該是「一對多」:每個Card對象都可以與許多對象相關。

另外,我覺得的DeckCardscardsSelected屬性將是多餘的,並且可以被刪除:如果選擇了卡(用於特定甲板),將有與其相關的一個DeckCards對象。如果未選中,則不會有與其相關的對象DeckCards

假定用戶選擇或創建一個Deck對象,我們將其稱爲currentDeck,然後從表視圖中選擇要用於該Deck中的卡片。在您的tableView:didSelectRowAtIndexPath:方法中,您爲所選卡片和卡片創建(或更新)DeckCards對象。不知道你如何確定numberSelected,可能是一個警報控制器或另一個視圖控制器?

是這樣的(順便說一下,請注意,在這個問題你的代碼中使用的是 「做 selectRow ......」 而不是 「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)來確定相應的卡片名稱(等)。

+0

哇,這可能是最詳細的和如何做某事最好的解釋之一!謝謝你,我只有一個與此有關的輕微事情,也就是說用戶想要編輯這個後綴並在不同的視圖控制器中更改deckcard對象,我只需在該視圖控制器上打開MOC並允許用戶刪除所選對象使用didselectatrow命令。當我這樣做時,還有什麼需要注意的,因爲我知道MOCS與它們與每個視圖控制器相關的方式在應用程序讀取關係方面是獨一無二的。 – Matthew

+0

我也在考慮讓用戶點擊1次單元1次2次卡2次,如果他們再次點擊它,它返回到一個我能夠使用相同的didselectatrow方法? – Matthew

+0

@Matthew是的,使用didSelectRow ...來增加選中的每個抽頭是有道理的,循環到零有效地取消選擇。如果用戶在其他地方沒有強有力的參考,您可以在用戶取消選擇時刪除DeckCards對象。例如,如果在一個VC中加載一個包含所有DeckCards對象的數組,然後繼續執行刪除操作,則需要確保更新數組以刪除現在已刪除的對象。 – pbasdf