【徒然DB】気ままにUIKit-CoreData編2〜エンティティを継承させた属性のメンテナンス〜
概要
このマガジンは四十を過ぎたおっさんが、
を参考にStoryboardでiOSアプリを完全に趣味で楽しんでいるだけな記事を気ままに上げてます。
今回
をハイ、レッツゴ🕺
前回の記事で、ゆっくりじっくりって言ってたんだけど、
晩飯にカレー食って、ちょっと時間が出来たので、記事をもうひとつ作った〜〜〜
前準備
念の為、
バックアップ
新規クラスを追加
メニュービューと新規ビューを追加
今回用の事前準備
をやってから本題へ💃
今回のコード(事前準備)
class AbstractEntityViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var myTextField: UITextField!
@IBOutlet weak var myLabel: UILabel!
//管理オブジェクトコンテキスト
var managedContext:NSManagedObjectContext!
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
do {
//管理オブジェクトコンテキストを取得する。
let applicationDelegate = UIApplication.shared.delegate as! AppDelegate
managedContext = applicationDelegate.persistentContainer.viewContext
//管理オブジェクトコンテキストからPlayerエンティティを取得する。
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Player")
let result = try managedContext.fetch(fetchRequest) as! [NSManagedObject]
//すべてのPlayerエンティティの名前をラベルに表示する。
for data in result {
myLabel.text = myLabel.text! + ",\n" + String(describing: data.value(forKey:"name")!)
}
//デリゲート先に自分を設定する。
myTextField.delegate = self
} catch {
print(error)
}
}
//Returnキー押下時の呼び出しメソッド
func textFieldShouldReturn(_ textField:UITextField) -> Bool {
do {
//ラベルの値にテキストフィールドの値を追記する。
myLabel.text = myLabel.text! + "," + myTextField.text!
//新しいPlayerエンティティを管理オブジェクトコンテキストに格納する。
let player = NSEntityDescription.insertNewObject(forEntityName: "Player", into: managedContext)
//Playerエンティティの名前にテキストフィールドの値を設定する。
player.setValue(myTextField.text, forKey:"name")
//管理オブジェクトコンテキストの中身を永続化する。
try managedContext.save()
//キーボードをしまう
self.view.endEditing(true)
} catch {
print(error)
}
return true
}
}
と、見やすいように、データを1つずつ改行しながら見えるようにエスケープ文字\nを入れた〜〜〜
なんかを参考にしてみてね🕺
本題
の設定項目ってことなんだけど、今回は、そんなに項目もないので、ひとつひとつじっくり見てく
Name
エンティティの名前
👉ソースコードからエンティティにアクセスするための識別子になる。
Abstract Entity
チェックを入れると抽象エンティティとなって、他のエンティティで継承できるようになる。
//
// ViewController.swift
//
import UIKit
import CoreData
class ViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var testLabel: UILabel!
@IBOutlet weak var testTextField: UITextField!
//管理オブジェクトコンテキスト
var managedContext:NSManagedObjectContext!
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
do {
//管理オブジェクトコンテキストを取得する。
let applicationDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
managedContext = applicationDelegate.managedObjectContext
//管理オブジェクトコンテキストからPlayerエンティティを取得する。
let fetchRequest = NSFetchRequest(entityName: "BaseballPlayer")
let result = try managedContext.executeFetchRequest(fetchRequest) as! [NSManagedObject]
//すべてのPlayerエンティティの名前をラベルに表示する。
for data in result {
testLabel.text = testLabel.text! + "," + String(data.valueForKey("name")!)
}
//デリゲート先に自分を設定する。
testTextField.delegate = self
} catch {
print(error)
}
}
//Returnキー押下時の呼び出しメソッド
func textFieldShouldReturn(textField:UITextField) -> Bool {
do {
//ラベルの値にテキストフィールドの値を追記する。
testLabel.text = testLabel.text! + "," + testTextField.text!
//新しいPlayerエンティティを管理オブジェクトコンテキストに格納する。
let player = NSEntityDescription.insertNewObjectForEntityForName("BaseballPlayer", inManagedObjectContext: managedContext)
//Playerエンティティの名前にテキストフィールドの値を設定する。
player.setValue(testTextField.text, forKey:"name")
//管理オブジェクトコンテキストの中身を永続化する。
try managedContext.save()
//キーボードをしまう
self.view.endEditing(true)
} catch {
print(error)
}
return true
}
}
を参考に、"Player"👉"BaseballPlayer"に変更するだけ〜〜〜〜
今回のコード(まとめ)
class AbstractEntityViewController: UIViewController, UITextFieldDelegate {
@IBOutlet weak var myTextField: UITextField!
@IBOutlet weak var myLabel: UILabel!
//管理オブジェクトコンテキスト
var managedContext:NSManagedObjectContext!
//最初からあるメソッド
override func viewDidLoad() {
super.viewDidLoad()
do {
//管理オブジェクトコンテキストを取得する。
let applicationDelegate = UIApplication.shared.delegate as! AppDelegate
managedContext = applicationDelegate.persistentContainer.viewContext
//管理オブジェクトコンテキストからPlayerエンティティを取得する。
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "BaseballPlayer")
let result = try managedContext.fetch(fetchRequest) as! [NSManagedObject]
//すべてのPlayerエンティティの名前をラベルに表示する。
for data in result {
myLabel.text = myLabel.text! + ",\n" + String(describing: data.value(forKey:"name")!)
}
//デリゲート先に自分を設定する。
myTextField.delegate = self
} catch {
print(error)
}
}
//Returnキー押下時の呼び出しメソッド
func textFieldShouldReturn(_ textField:UITextField) -> Bool {
do {
//ラベルの値にテキストフィールドの値を追記する。
myLabel.text = myLabel.text! + "," + myTextField.text!
//新しいPlayerエンティティを管理オブジェクトコンテキストに格納する。
let player = NSEntityDescription.insertNewObject(forEntityName: "BaseballPlayer", into: managedContext)
//Playerエンティティの名前にテキストフィールドの値を設定する。
player.setValue(myTextField.text, forKey:"name")
//管理オブジェクトコンテキストの中身を永続化する。
try managedContext.save()
//キーボードをしまう
self.view.endEditing(true)
} catch {
print(error)
}
return true
}
}
Parent Entity
Entityを継承させる場合に抽象エンティティ名を設定
と、ここの内容は以上。
ブラッシュアップ
いつもどおり、地球儀ボタンだけ追加しとく〜〜〜
記事公開後、
今回の操作で、
エンティティの属性が複数のビューでも使えるってことがわかったね👀
これが単体ビューごとにプロジェクトを作ってると、
点にしかならないから、
理屈で分かってもイメージができない人が多いんだよね。
Apple公式
さて、次回は
をレッツゴする🕺
この記事が気に入ったらサポートをしてみませんか?