[英]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
數組。 所以我將NSManagedObject
子NSManagedObject
如下:
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.