この記事には広告を含む場合があります。
記事内で紹介する商品を購入することで、当サイトに売り上げの一部が還元されることがあります。
WordPressを使っているサイトのネイティブアプリ化(AppleWatch対応版)のチュートリアル第3回目です。
(第3回はこちら→第3回「WebViewでページを表示する」)
作るのはこんなアプリ
アプリ版AppleWatchJournalをそのまま作成します。
詳しい動作は実際のアプリを参照ください!
※そして、もしよかったらAppleWatchJournalも定期的にチェックしていただけますと超幸いです。よろしくです。
MagicalRecordのインストール
お気に入りの記事を保存(あとで読む記事的なイメージ)するために、CoreDataを利用します。
とはいえ、CoreDataは初心者には扱うのがなかなか難しいもの。
というわけで、CoreDataのラッパーライブラリであるMagicalRecordを利用します。
iOSライブラリの管理ツール「CocoaPods」のインストール
cocoapodsはrubygemのライブラリなので、ターミナルからgem installコマンドでインストールします。
rubyとgemコマンドが利用できる環境を事前に設定しておいてください。
$ sudo gem install cocoapods
続いて、cocoapodsのセットアップを実行。
$ pod setup
きちんとインストールされていることを確認する意味でも、バージョンを確認してみましょう。
$ pod --version
私の現在の環境では「0.37.2」と返ってきました。
プロジェクトにMagicalRecordをインストールする
cdコマンドで、xcodeのプロジェクトのフォルダへ移動し、以下のコマンドを実行します。
$ pod init
フォルダ内に「Podfile」というファイルが生成されていると思います。
ファイルを開いたら、以下の様にMagicRecordを追加。
target 'AWJClone' do pod 'MagicalRecord' end target 'AWJCloneTests' do end
pod insallコマンドでインストールします。
$ pod install
プロジェクトフォルダをみると、「AWJClone.xcworkspace」というファイルが生成されていると思います。
これまでは、XcodeでAWJClone.xcodeprojを開いていたと思いますが、今後はAWJClone.xcworkspaceを開くようにしましょう。
MagicalRecordのセットアップ
Bridging Headerを設定
MagicalRecordはObjective-C製のライブラリなので、Swiftで利用するためにはBridging Headerを使う必要があります。
Xcodeの上部メニューからFile > New > File…を選択。
Header Fileを選択。
ファイル名を「AWJReaderApp-Bridging-Header」としてCreate。
作成したAWJReaderApp-Bridging-Header.hを、以下のように編集します。
#ifndef AWJClone_AWJReaderApp_Bridging_Header_h #define AWJClone_AWJReaderApp_Bridging_Header_h #import "MagicalRecord.h" #endif
編集したAWJReaderApp-Bridging-Header.hを、Bridging Headerとして利用するために、ファイルパスをXcodeで指定します。
アプリのTARGETSからBuild Settingsを選択。
「Swift Compiler – Code Generation」の「Objective-C Bridging Header」の入力エリアをタップし、先ほど作成したAWJReaderApp-Bridging-Header.hのフルパスを入力します。
続いて、AppDelegate.swiftに以下のとおり、MagicalRecordを利用するための設定を記述します。
func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool { MagicalRecord.setupCoreDataStackWithAutoMigratingSqliteStoreNamed("AWJClone.sqlite") UINavigationBar.appearance().tintColor = UIColor.whiteColor() return true }
func applicationWillTerminate(application: UIApplication) { MagicalRecord.cleanUp() self.saveContext() }
以上でMagicalRecordのセットアップは完了です。
お気に入り記事の一覧画面を作成する
「お気に入り一覧画面」のレイアウトを作成する
Main.storyboardを開いて、ObjectLibraryからView Controllerをキャンパス内にドラッグ&ドロップ。
さらに、Table ViewをView Controllerの中心にドラッグ&ドロップします。
Attributes InspectorのPrototype Cellsを1に変更。
Size InspectorのRow Heightを80に変更。
メイン画面の時と同様に、Connections InspectorでdatasourceとDelegateをそれぞれView Controllerと接続。
Table View Cellを選択し、Attributes InspectorのIdentifierでセルに対して任意の名称を指定。
今回はお気に入りセルという意味で「FavCell」と命名しました。
メイン画面と違い、お気に入り記事一覧はサムネイルなしのシンプルなテーブルで実装するので、Custom Cellは使わずにデフォルトのセルを使います。
そのため、画面レイアウトの作成は、これだけで完了です。
「お気に入り記事一覧」用のViewControllerを作成する
File > New > File…からCocoa Touch Classを選択。
「FavViewController」などわかりやすい名前をつけ、Subclass ofに「UIViewController」を選択してファイルを作成します。
メイン画面と同様に、プロトコルを指定します。
class FavViewController: UIViewController, UITableViewDataSource, UITableViewDelegate {
一旦storyboardに戻り、お気に入り記事一覧画面のViewControllerのIdentify InspectorのCustom Classで、先ほど作成した「FavViewController」を指定。
さらに、Table Viewをoutlet接続します。
まだエラーが出ていると思いますが、ここは一旦置いといて…
先にお気に入り記事のデータを格納するためのモデルを作成します。
お気に入り記事のモデルを作成する
お気に入り記事用のエンティティを作成する
お気に入り記事の保存に利用するCoreDataのエンティティを作成します。
AWJClone.xcdatamodeldを選択し、「Add Entry」をクリック。
続いて「Add Attribute」をタップ。
「Attribute:title」「Type:String」の属性を追加します。
同様に、String型の属性「url」「adddate」を追加します。
お気に入り記事のモデル用ファイルを作成する
AWJClone.xcdatamodeldを選択した状態で、上部メニューからEditor > Create NSManagedObject Subclass…を選択。
Data Modelを選択して「NEXT」をクリック。
先ほど作成したエンティティーを選択し、「NEXT」をクリック。
ファイルの保存先を指定して「Create」をクリックします。
※Group, Targetの指定を忘れずに!
Objective-C製のライブラリ(MagicalRecord)から利用できるように、@objcを使う必要があるので、以下のように記述します。
import Foundation import CoreData @objc(Entity) class Entity: NSManagedObject { @NSManaged var title: String @NSManaged var url: String @NSManaged var adddate: String }
再びAWJClone.xcdatamodeldを表示し、Data Model inspectorでClassを先ほど作成した「Entity」に変更します。
お気に入り記事の一覧ViewControllerを完成させる
まだエラーが残っていた「FavViewController」のUITableViewDelegate, UITableViewDataSourceメソッドを追加します。
class FavViewController: UIViewController, UITableViewDataSource, UITableViewDelegate { @IBOutlet weak var tableView: UITableView! var entries: [Entity]! override func viewDidLoad() { super.viewDidLoad() entries = Entity.MR_findAll() as? [Entity] } override func didReceiveMemoryWarning() { super.didReceiveMemoryWarning() } func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { return entries.count } func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { let cell = UITableViewCell(style: UITableViewCellStyle.Subtitle, reuseIdentifier: "FavCell") cell.textLabel!.text = entries[indexPath.row].title cell.textLabel?.numberOfLines = 3 cell.detailTextLabel?.text = "追加した日; " + entries[indexPath.row].adddate cell.detailTextLabel?.textColor = UIColor.grayColor() return cell } }
処理の内容としては、viewDidLoadで、MagicalRecordのMR_findAll()メソッドを使いEntityを全て取得。
Entity内の属性「タイトル」「追加日」を、デフォルトのTable Cellの要素に代入しています。
ついでに、タイトルは3行まで表示・追加日の文字色をグレーに設定しておきます。
まだデータベースに登録する処理が実装されていないので、中身は空っぽですが、これでエラーも消え、お気に入り記事一覧画面の最低限の機能が備わりました。
メイン画面→お気に入り記事一覧画面の遷移を作成する
メイン画面に「お気に入り」ボタンを設置
ObjectLibraryからNavigation Itemを選択し、画面内にドラッグ&ドロップ。
Attributes InspectorのTitleを空白に変更します。
続いて、ObjectLibraryからBar Button ItemをNavigation Barの右端あたりにドラッグ&ドロップ。
Identifierを「Bookmarks」に変更します。
「お気に入り」「あとで読む」を表示する画面への遷移ボタンです。
僕はブックマークボタンで作成しましたが、もっとイメージに合うボタンを選んだり、自作の画像を設定することも可能です。
アプリの個性を出したい場合は、検討してみてください!
お気に入りボタン→お気に入り記事一覧画面への遷移
作成したお気に位入りボタンをControlキーを押しながら、お気に入り一覧画面へドラッグ&ドロップ。
セグエは「show」を選択。
これで画面が接続されました。
ここまで完成した状態でビルド→実行してみると、「お気に入り記事一覧画面」への遷移と、空っぽのテーブル画面が表示されることを確認できると思います。
という感じで本日はここまで。
下準備がいろいろ必要で、結構試行錯誤が必要な画面でなかなか大変でした。
「お気に入り記事一覧画面」の実装はまだ未完成ですが、次回はきっちりと完成まで進めたいと思います。
そして、その次の回で、ようやくAppleWatch対応をしていく予定です。(やっと!)
ちなみに、今回の記事はこちらの記事↓をかなり参考にさせていただきました。
同じくiOS開発の初心者とは思えないレベルの高い記事ですので、MagicalRecordをもっとちゃんと知りたい人は、こちらの記事や記事内のリンクを参考にしてみてください!
連載記事
第1回「HTTP通信でブログのデータを取得する」
第2回「テーブルビューに情報を表示する」
第3回「WebViewでページを表示する」
第4回「お気に入りの記事を保存する(前編)」
第5回「お気に入りの記事を保存する(後編)」
第6回「AppleWatch対応」