Lou*_*. B 4 core-data ios 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")
}
}
Run Code Online (Sandbox Code Playgroud)
我想持久存储一个Song使用CoreData 调用的对象.该Song对象具有一个属性,该属性是一个数组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?
}
Run Code Online (Sandbox Code Playgroud)
基本上我被困在那里了.我已经BinaryData在CoreData模型视图中设置了属性的类型,并NSKeyedArchiver.archivedDataWithRootObject(myObject)在保存ManagedContext之前和NSKeyedArchiver.unarchiveObjectWithData(myObject) as? [Chord]获取实体之后尝试使用,但是当我取消归档时,NSData我得到了一个UILabel对象,尽管我已经设置了as? [Chord].
任何人都可以让我走正确的路?
这里有几个非常重要的事情:
首先,将UI对象保存到Core Data或任何数据文件是一个糟糕的主意.在技术上可以做你想做的事情,但这是非常糟糕的设计.您应该保存数据,而不是UI对象.您应该根据数据配置UI,而不是保存实际的UI对象.虽然MVC是一种策略而不是铸铁规则,但将模型和视图混合到这个程度是一个非常糟糕的主意.您应该做的是保存模型中和弦的所有相关数据(详细信息如名称等),但不是UILabel用于显示它的实际数据.
其次,纯粹是为了理解核心数据,而不是在这种特定情况下你应该做的事情 - 如果你想在Core Data中保存自定义对象,你需要确保你的对象的类符合NSCoding.如果对Core Data属性使用"transformable"类型,Core Data将使用NSCoding方法对自定义对象进行编码/解码.UILabel符合NSCoding,所以如果这是一个好主意UILabel,它不是,你需要覆盖NSCoding你的子类中的方法.
| 归档时间: |
|
| 查看次数: |
1557 次 |
| 最近记录: |