我有一个xCode项目,我想重新加载一个包含用户分数的标签,
这是代码:
@IBOutlet weak var moneyLabel: UILabel!
@IBOutlet weak var imageMoneyMove: UIImageView!
var managedObjextContext:NSManagedObjectContext!
var coreDataMoney = [Money] ()
var money:Int = 0
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
managedObjextContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
loadData()
let moneyItem = Money(context: managedObjextContext)
moneyLabel.text! = String(moneyItem.allMoney)
}
func loadData() {
let presentRequest:NSFetchRequest<Money> = Money.fetchRequest()
do {
coreDataMoney = try managedObjextContext.fetch(presentRequest)
} catch {
print("Could not load data from database \(error.localizedDescription)")
}
}
@IBAction func addMoney(_ sender: Any) {
let moneyItem = Money(context: managedObjextContext)
money += 1
moneyItem.allMoney = Float(money)
moneyLabel.text! = String(moneyItem.allMoney)
print(moneyItem.allMoney)
do {
try self.managedObjextContext.save()
self.loadData()
}catch {
print("Could not save data \(error.localizedDescription)")
}
print(moneyItem.allMoney)
}`
我有一个名为Money的实体和一个Float类型的属性,并命名为allMoney。谢谢!
答案 0 :(得分:0)
假设你有一个实体Money
应该包含一条记录,我建议使用自定义getter和setter实现一个计算属性。
我将coreDataMoney
改为money
,money
改为amount
首先声明Money
对象的变量和托管对象上下文的惰性实例化变量。
var money : Money!
lazy var managedObjextContext : NSManagedObjectContext = {
return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
}()
声明变量amount
。
get
之后检查包含money
的变量NSManagedObject
是否为nil
。如果是,则加载该对象,然后返回该值。
set
之后更新NSManagedObject
对象中的值,保存上下文并更新标签。
var amount : Float {
get {
if money == nil {
loadData()
}
return money.allMoney
}
set {
money.allMoney = newValue
saveContext()
moneyLabel.text! = String(newValue)
}
}
创建一个方便的方法来保存上下文。
func saveContext() {
do {
try self.managedObjextContext.save()
} catch {
print("Could not save data \(error.localizedDescription)")
}
}
loadData()
方法加载Money
对象。如果实体为空,请创建一个。
func loadData() {
let presentRequest:NSFetchRequest<Money> = Money.fetchRequest()
do {
let coreDataMoney = try managedObjextContext.fetch(presentRequest)
if coreDataMoney.isEmpty {
let moneyItem = Money(context: managedObjextContext)
money = moneyItem
saveContext()
} else {
money = coreDataMoney.first!
}
} catch {
print("Could not load data from database \(error.localizedDescription)")
}
}
在viewDidLoad
中获取变量amount
以加载数据并更新标签。
override func viewDidLoad() {
super.viewDidLoad()
moneyLabel.text! = String(amount)
}
最后在addMoney
方法中只增加amount
属性。 setter逻辑更新CoreData堆栈和标签。
@IBAction func addMoney(_ sender: Any) {
amount += 1.0
}