重新加载标签swift 3核心数据

时间:2017-06-10 11:34:26

标签: ios core-data swift3

我有一个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。谢谢!

1 个答案:

答案 0 :(得分:0)

假设你有一个实体Money应该包含一条记录,我建议使用自定义getter和setter实现一个计算属性。

我将coreDataMoney改为moneymoney改为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
    }