2016-01-13 82 views
4

我有一個名爲Chord類的子類UILabel如何在Swift中使用CoreData存儲自定義對象?

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稱爲SongSong對象有一個屬性,該屬性是Chord的數組。所以我子類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),但是當我取消存檔NSData時,雖然我設置了as? [Chord],但仍得到UILabel對象。

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

回答

7

有一對夫婦的真正重要的東西在這裏:

首先,節約UI對象,以核心數據,或任何數據文件,是一個可怕的想法。在技​​術上可以做你想做的事情,但這是非常糟糕的設計。你應該保存你的數據,而不是你的UI對象。您應該根據您的數據配置您的用戶界面,而不是保存實際的用戶界面對象。雖然MVC是一種策略而不是鑄鐵法則,但將這種模式和觀點混合在一起是一個非常糟糕的主意。你應該做的是在模型中保存和絃的所有相關數據(詳細信息如名稱等),但不是用於顯示它的實際UILabel

第二,純粹的理解核心數據的利息,但不東西,如果你想保存在覈心數據的自定義對象,你應該在這個特定case--做,你要確保你的對象的類符合NSCoding。如果對「核心數據」屬性使用「可變形」類型,Core Data將使用NSCoding方法對自定義對象進行編碼/解碼。 UILabel符合NSCoding,所以如果這是一個好主意UILabel,它不是,您需要覆蓋子類中的NSCoding方法。

+1

好吧,我明白了,那就是我在此期間所做的(僅存儲用於構建uilabel的數據)。我現在明白爲什麼我試圖做的是一個壞主意。非常感謝您的回答。 –

相關問題