Swiftで遊ぼう! - 635 - Zoomania 4
- Swiftで遊ぼう!の前書き-> Life-LOG OtherSide
- Swift2.1 & Xcode7.1対応の日本語版アップルチュートリアル!
- Table View実装チュートリアルをXcode7.2.1で解説
- Core Data シンプルチュートリアル
- 私の本業、オフィシャルなブログ-> Life-LOG
アプリを立ち上げると自動的にデータがロードされるクラス、DataHelperを作りました。次はこれをNSFetchedResultsControllerを使ってUITableViewに表示しなければなりません。
まずどうしても必要なのがUITableViewです。UITableViewの設置は何度もしているので今更説明する必要はないので次の手順に従います。
UITableViewのプロトコールに準拠するのは当たりませとしてNSFetchedResultsControllerを利用するためにプロトコールに準拠させる必要があります。
さて、私の読んでいるチュートリアル(何をパクっているか分かった人いますが?)によると、著者はNSManagedObjectContextインスタンスのベストな扱い方を色々考えていたようです。
私の過去のチュートリアルのように、必要になった時に何度も同じコードを書いてAppDelegateから読み込むのではViewControllerファイルに長たらしいコードが並んで*1見た目に汚いコーディングになります。
彼はAppDelegateファイルでNSManagedObjectContextのインスタンス化*2されているので、ViewControllerにそのリファレンスとして渡してしまうというやり方を取っていました。
具体的にコードで説明します。ViewControllerファイルのコードを続けます。
class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, NSFetchedResultsControllerDelegate { var context: NSManagedObjectContext! ...
このように変数contextを宣言した場合、普通ならばイニシャライザーを使ってインスタンス化させなければならないのですが、裏で(AppDelegate)でインスタンス化しているNAManagedObjectContextを渡してしまおうということです。
ということでAppDelegateファイルをみます。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { // Override point for customization after application launch. let dataHelper = DataHelper(context: self.managedObjectContext) dataHelper.seedDataStore() // ここまでのステップはデーターベースに値を入れるステップです。 let rootViewController = self.window!.rootViewController as! ViewController rootViewController.context = self.managedObjectContext; // ここがポイントです。 ...
「let rootViewController = self.window!.rootViewController as! ViewController」がポイントです。開発中のViewController、そうです変数contextを持たせたViewControllerをrootViewControllerにキャストさせます。
そしてAppDelegateが持っているプロパティmanagedObjectContextを指定してやると、ViewControllerでcontextとして動くようになります。結構スマートで美しいコーディングですね。
今日はここまで。
*2:プロジェクト作成時にUse CoreDataのチェックマークを入れた場合です。