swiftの学習(coredataを使用)
ちょっとわかりにくいとつい後回しになる癖がある
わかることからやるのはいいけど取り組むのはなるべく早くしたほうがいいと思う
準備
プロジェクト作成時にcoredataのチェックを入れる
エンティティを追加
エンティティに名前を設定してフィールド要素などを追加
モデルのコードを自動生成する
↓作成されたコード
// // Todo.swift // import Foundation import CoreData class Todo: NSManagedObject { @NSManaged var name: String @NSManaged var memo: String }
エンティティのクラス名を変更
※この名前にしないとうまく動かないようなので修正
実装
ナビゲーションとかいろいろしているけど今回は割愛します
ViewController
import UIKit import CoreData class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet var tableview: UITableView! // Todoモデルを格納する配列 var items = [Todo]() override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // タイトルを設定 self.title = "TODO" } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } // viewDidLoadは最初の一回しか呼ばれないので、viewWillAppearを使うよ override func viewWillAppear(animated: Bool) { println("cccc") // AppDelegateクラスのインスタンスを取得 let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate // AppDelegateクラスからNSManagedObjectContextを取得 // ゲッターはプロジェクト作成時に自動生成されている if let managedObjectContext = appDelegate.managedObjectContext { // EntityDescriptionのインスタンスを生成 let entityDiscription = NSEntityDescription.entityForName("Todo", inManagedObjectContext: managedObjectContext); // NSFetchRequest SQLのSelect文のようなイメージ let fetchRequest = NSFetchRequest(); fetchRequest.entity = entityDiscription; var error: NSError? = nil; // フェッチリクエストの実行 if var results = managedObjectContext.executeFetchRequest(fetchRequest, error: &error) { items = [] for managedObject in results { let model = managedObject as Todo; items.append(model) } } } } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int{ // リストの件数を返す return items.count } // セルをitemsから設定する処理 func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell{ let cell: UITableViewCell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "Cell") cell.textLabel?.text = items[indexPath.row].name cell.detailTextLabel?.text = items[indexPath.row].memo return cell } // セルをクリックした時に発生するイベント func tableView(tableView: UITableView, didSelectRowAtIndexPath indexPath: NSIndexPath){ performSegueWithIdentifier("page1", sender: self) } }
EditController
import UIKit import CoreData class EditController: UIViewController { @IBOutlet weak var name: UITextField! @IBOutlet weak var memo: UITextField! override func viewDidLoad() { super.viewDidLoad() // Do any additional setup after loading the view, typically from a nib. // タイトルを設定 self.title = "Edit" } override func viewWillDisappear(animated: Bool) { let viewControllers = self.navigationController?.viewControllers! if indexOfArray(viewControllers!, searchObject: self) == nil { // 戻るボタンが押された処理 println("back!") // 追加処理 if name.text == "" && memo.text == "" { }else{ // AppDelegateクラスのインスタンスを取得 let appDelegate = UIApplication.sharedApplication().delegate as AppDelegate // AppDelegateクラスからNSManagedObjectContextを取得 // ゲッターはプロジェクト作成時に自動生成されている if let managedObjectContext = appDelegate.managedObjectContext { // NSEntityDescriptionから新しいエンティティモデルのインスタンスを取得 // 第一引数はモデルクラスの名前、第二引数はNSManagedObjectContext let managedObject: AnyObject = NSEntityDescription.insertNewObjectForEntityForName("Todo", inManagedObjectContext: managedObjectContext) // エンティティモデルにデータをセット let todo = managedObject as Todo todo.name = name.text todo.memo = memo.text // AppDelegateクラスに自動生成された saveContext で保存完了 appDelegate.saveContext() } } } super.viewWillDisappear(animated) } func indexOfArray(array:[AnyObject], searchObject: AnyObject)-> Int? { for (index, value) in enumerate(array) { if value as UIViewController == searchObject as UIViewController { return index } } return nil } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() // Dispose of any resources that can be recreated. } }
結果
所感
データの更新や削除はまだない
coredataの使い方の簡単な方法をやってみたけど結構手間取った。
以前やったことも忘れているのがいくつかあったのでもう一度やり直しが必要
コードだけでやる場合とストーリーボードを使う方法でいくつか差異があるので大変