【问题标题】:How to store custom object with CoreData in Swift?如何在 Swift 中使用 CoreData 存储自定义对象?
【发布时间】:2016-01-13 23:11:37
【问题描述】:

我有一个名为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 子分类如下:

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.archivedDataWithRootObject(myObject) 在获取实体后使用 NSKeyedArchiver.unarchiveObjectWithData(myObject) as? [Chord],但是当我取消归档 NSData 时,我得到了一个 UILabel 对象虽然我已经设置了as? [Chord]

任何人都可以让我走上正确的道路吗?

【问题讨论】:

    标签: ios swift core-data


    【解决方案1】:

    这里有几件非常重要的事情:

    首先,将 UI 对象保存到 Core Data 或任何数据文件是一个糟糕的主意。技术上可以做你想做的事,但这是非常糟糕的设计。您应该保存数据,而不是 UI 对象。您应该根据您的数据配置您的 UI,而不是保存实际的 UI 对象。尽管 MVC 是一种策略而不是铁的规则,但将模型和视图混合到这种程度是一个非常糟糕的主意。您应该做的是保存模型中和弦的所有相关数据(名称等详细信息),而不是用于显示它的实际UILabel

    其次,纯粹是为了理解 Core Data,但不是在这种特定情况下应该做的事情——如果你想在 Core Data 中保存一个自定义对象,你会想要确保您的对象的类符合NSCoding。如果您对 Core Data 属性使用“可转换”类型,Core Data 将使用NSCoding 方法来编码/解码您的自定义对象。 UILabel 符合 NSCoding,所以如果这对 UILabel 来说是个好主意,但不是,你需要在你的子类中重写 NSCoding 方法。

    【讨论】:

    • 好的,我明白了,这实际上是我在此期间所做的(仅存储用于构建 uilabel 的数据)。我现在明白为什么我试图做的是一个坏主意。非常感谢您的回答。
    猜你喜欢
    • 2011-03-30
    • 2019-07-28
    • 2011-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    相关资源
    最近更新 更多