簡體   English   中英

如何在Swift中使用CoreData存儲自定義對象?

[英]How to store custom object with CoreData in Swift?

我有一個名為Chord的類,它將UILabel子類化:

import UIKit

class Chord: UILabel {

var numTextLine: Int?
var positionInTextLine: CGFloat?
var tempPosInLine: CGFloat?

init(chordName: String, dLine: DLine, xAxis: CGFloat, posInTextLine: CGFloat) {
    // posInLine: CGFloat
    let labelSize = chordName.sizeWithAttributes([NSFontAttributeName: UIFont.systemFontOfSize(14.0)])
    let labelPositionY = ((dLine.upLine.frame.height) - labelSize.height) / 2

    super.init(frame: CGRect(origin: CGPoint(x: xAxis, y: labelPositionY), size: labelSize))

    self.numTextLine = dLine.numTextLine
    self.positionInTextLine = posInTextLine

    self.tempPosInLine = self.positionInTextLine

    self.text = chordName
    self.font = self.font.fontWithSize(14)
    self.textAlignment = NSTextAlignment.Center
    self.userInteractionEnabled = true
}

required init?(coder aDecoder: NSCoder) {
    super.init(coder: aDecoder)
    //fatalError("init(coder:) has not been implemented")
}
}

我想使用CoreData持久存儲一個名為Song的對象。 Song對象的屬性是Chord數組。 所以我將NSManagedObjectNSManagedObject如下:

import Foundation
import CoreData

class Song: NSManagedObject {
    @NSManaged var lyrics: NSString?
    @NSManaged var chords: NSData?
    @NSManaged var title: NSString?
    @NSManaged var artist: NSString?
}

基本上我被困在那里了。 我在CoreData模型視圖中將屬性的類型設置為BinaryData ,並在將ManagedContext和NSKeyedArchiver.unarchiveObjectWithData(myObject) as? [Chord]保存為之前嘗試使用NSKeyedArchiver.archivedDataWithRootObject(myObject) NSKeyedArchiver.unarchiveObjectWithData(myObject) as? [Chord] NSKeyedArchiver.unarchiveObjectWithData(myObject) as? [Chord]獲取實體后,但是當我取消歸檔NSData我得到了一個UILabel對象,雖然我已經設置as? [Chord] as? [Chord]

任何人都可以讓我走正確的路?

這里有幾個非常重要的事情:

首先, 將UI對象保存到Core Data或任何數據文件是一個糟糕的主意 在技​​術上可以做你想做的事情,但這是非常糟糕的設計。 您應該保存數據,而不是UI對象。 您應該根據數據配置UI,而不是保存實際的UI對象。 雖然MVC是一種策略而不是鑄鐵規則,但將模型和視圖混合到這個程度是一個非常糟糕的主意。 您應該做的是保存模型中和弦的所有相關數據(詳細信息如名稱等),但不是用於顯示它的實際UILabel

其次,純粹是為了理解核心數據而不是在這種特定情況下應該做的事情 - 如果你想在Core Data中保存自定義對象,你需要確保你的對象的類符合NSCoding 如果對Core Data屬性使用“transformable”類型,Core Data將使用NSCoding方法對自定義對象進行編碼/解碼。 UILabel符合NSCoding ,所以如果這對UILabel來說是一個好主意,它不是 ,你需要覆蓋子類中的NSCoding方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM