2017-06-10 13 views
-1

私はXcodeのプロジェクトを持っていると私は、ユーザーのスコアが含まれているラベルをリロードしたい、ここでリロードラベルの迅速な3つのコアデータ

はコードです:

@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) 
}` 

私はお金をエンティティと呼ばれてきたし、 Float型の属性であり、allMoneyという名前を持つ。ありがとうございました !

+0

、アプリケーションの起動時に、私はそれをしたいと思い、私のスコアが表示されます。 –

答えて

0

エンティティMoneyに1つのレコードが含まれていると仮定すると、カスタムゲッターとセッターで計算されたプロパティを実装することをお勧めします。

私はまず第一にMoneyオブジェクトと管理オブジェクトコンテキストの怠惰なインスタンス化変数のための変数を宣言しamount

  • moneymoneycoreDataMoneyの名前を変更しました。

    var money : Money! 
    
    lazy var managedObjextContext : NSManagedObjectContext = { 
        return (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext 
    }() 
    
  • 変数amountを宣言します。

    • get TERチェックNSManagedObjectを含む変数moneynilある場合。 「はい」の場合、オブジェクトがロードされ、値が戻されます。

    • 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オブジェクトをロードします。エンティティが空の場合、エンティティを作成します。 viewDidLoad

    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)") 
        } 
    } 
    
  • は、データをロードし、ラベルを更新するamount変数を取得します。 addMoney方法で最後に

    override func viewDidLoad() { 
        super.viewDidLoad() 
        moneyLabel.text! = String(amount) 
    } 
    
  • だけamountプロパティをインクリメントします。セッターロジックは、CoreDataスタックとラベルを更新します。

    @IBAction func addMoney(_ sender: Any) { 
        amount += 1.0 
    } 
    
+0

ありがとうございますが、私は2つのエラーがあります:第1行は、可変関数の値の宣言の最初の行で、関数型ではない値を 'Double'で呼び出すことはできません。moneyLabel.text = )は、自身の初期値内で使用される変数を示します。もう一度ありがとうございます –

+0

私の悪い、私は答えを更新しました。 – vadian

+0

ありがとう、ごめんなさいxD –