FPPopoverを利用する
利用するライブラリが決まったら、まずObjective-Cでそのライブラリを動かせるようにします。その際にどのクラスをどのように使うかを理解して、Swiftのプロジェクトにそれらのクラスを配置します。
利用しているクラスを特定する
FFPopoverはGitHubから入手できます。ソースコードを入手後、FPPopoverDemoディレクトリ内にObjective-Cのデモプロジェクトがあるので、Xcodeで開きます。最初に呼び出されるFPAppDelegateクラスからソースを追うと、FPViewController.mのpopover:(id)senderメソッドでポップオーバーを表示していることが分かります。該当する箇所は次の通りです。
-(IBAction)popover:(id)sender { ...中略... // ポップオーバーの内部に表示するビューコントローラーのオブジェクトを生成 DemoTableController *controller = [[DemoTableController alloc] initWithStyle:UITableViewStylePlain]; controller.delegate = self; // ビューコントローラーを指定してポップオーバーを表すクラスを初期化 popover = [[FPPopoverKeyboardResponsiveController alloc] initWithViewController:controller]; // ポップオーバーの属性を指定 popover.tint = FPPopoverDefaultTint; popover.keyboardHeight = _keyboardHeight; if(UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) { // ポップオーバーのサイズを指定 popover.contentSize = CGSizeMake(300, 500); ...中略... // どこから表示するのかを指定 popover.arrowDirection = FPPopoverArrowDirectionAny; // ポップオーバーを表示 [popover presentPopoverFromView:sender]; } }
ポップオーバーを生成するクラスはFPPopoverKeyboardResponsiveControllerクラスであることがわかります。次は、FPPopoverKeyboardResponsiveControllerクラスのヘッダファイルであるFPPopoverKeyboardResponsiveController.hファイルを参照します。
// FPPopoverControllerクラスをインポート #import "FPPopoverController.h" // FPPopoverControllerクラスを継承 @interface FPPopoverKeyboardResponsiveController : FPPopoverController
上記の通り、FPPopoverKeyboardResponsiveControllerクラスはFPPopoverControllerクラスを継承しています。そこで次は継承元のFPPopoverControllerクラスのヘッダファイルであるFPPopoverController.hファイルを参照します。
// インポートしているファイル #import "ARCMacros.h" #import "FPPopoverView.h" #import "FPTouchView.h" @class FPPopoverController;
FPPopoverController.hファイルから他のファイルをインポートしていることがわかります。これまでに出てきたファイルがFPPopoverを利用するのに必要なファイルであることがわかります。Swiftのプロジェクトにはこれらのファイル全てをコピーします。
SwiftからObjective-Cのライブラリを利用する場合には、ライブラリのソースを全部読む必要はありません。必要な箇所と呼び出しているファイルのみ分かれば十分です。
Objective-Cのファイルをプロジェクト内に配置する
前項までの作業で、ポップオーバーに必要なファイルが特定できました。それらのファイルは次の通りです。
ファイル名 | 概要 |
---|---|
FPPopoverKeyboardResponsiveController.h/m | ポップオーバー部のインターフェース |
FPPopoverController.h/m | ポップオーバーの実態クラス |
FPPopoverView.h/m | ポップオーバーの内部クラス |
FPTouchView.h/m | ポップオーバーのタッチ関連の管理クラス |
ARCMacros.h | ポップオーバー内の定数の管理ファイル |
これらのファイルをSwiftのプロジェクトにコピーして配置します。サンプルでは、プロジェクト内にFPPopoverの名前でフォルダを作成してそこにファイルを配置しています。
ファイルを配置した後は、Swiftでこれらのクラスを呼び出せるようにSample-Bridging-Header.hにヘッダファイルを記述します。
#import "FPPopoverKeyboardResponsiveController.h" #import "FPPopoverController.h" #import "FPPopoverView.h" #import "FPTouchView.h" #import "ARCMacros.h"
ポップオーバーで呼び出されるメニュー画面を作成する
デモのプロジェクトを参照すると、ポップオーバーの内容として利用されているビューコントローラーの実態はFPDemoTableViewControllerクラスです。
// ポップオーバーの内部に表示するビューコントローラーのオブジェクトを生成 DemoTableController *controller = [[DemoTableController alloc] initWithStyle:UITableViewStylePlain]; controller.delegate = self; // ビューコントローラーを指定してポップオーバーを表すクラスを初期化 popover = [[FPPopoverKeyboardResponsiveController alloc] initWithViewController:controller];
FPDemoTableViewControllerクラスのソースを追うと、UITableViewControllerクラスを継承したテーブルビューコントローラーであることがわかります。
// UITableViewControllerを継承 @interface FPDemoTableViewController : UITableViewController // 特別なメソッドやプロパティは使用していない @end
上記の通り、FPDemoTableViewControllerクラスには特別なプロパティやメソッドはなく、UITableViewControllerクラスを継承しただけのテーブルビューコントローラーであることがわかります。
サンプルでも同様に、UITableViewControllerクラスを継承したテーブルビューコントローラーを作成します。XcodeでUITableViewControllerクラスを継承したビューコントローラーのクラスを作成すると、DataSorceやdelegateを継承したソースコードが自動で出力されます。出力されたソースコードを以下のように補完して、簡単なテーブルビューコントローラーを作成します。
class TableViewController: UITableViewController { // セルの識別子、表示内容を配列で定義 let kCellIdentifier = "CellIdentifier" var items : Array<String> = ["item1", "item2", "item3"] // 画面表示処理 override func viewDidLoad() { // 特別な処理は行わない super.viewDidLoad() } // テーブルのセクション数 override func numberOfSectionsInTableView(tableView: UITableView) -> Int { return 1 } // テーブルのセル数 override func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { // 配列itemsの要素の数を返却 return self.items.count; } // 表示するセルの形式と表示内容を指定 override func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { // テーブルのセルをUITableViewCellStyle.Defaultのスタイルで生成 var cell = tableView.dequeueReusableCellWithIdentifier(kCellIdentifier) as? UITableViewCell if cell == nil { cell = UITableViewCell(style: UITableViewCellStyle.Default, reuseIdentifier: kCellIdentifier) } // セルのラベルに配列itemsの該当する値を指定 cell?.textLabel?.text = self.items[indexPath.row] return cell! } // テーブルのセルが選択された際の処理 override func tableView(tableView: UITableView?, didSelectRowAtIndexPath indexPath:NSIndexPath) { // 選択されたセルの文字列を取得 var item : String = self.items[indexPath.row] }
ポップオーバーの内容として表示するテーブルビューコントローラーは、特別な処理は行わず、テーブルを表示する機能のみを実装しています。
まとめ
今回はSwiftからObjective-Cを呼び出す基本的な説明を行いました。次回は、SwiftからObjective-Cのライブラリを呼び出しつつ、アプリの中でのライブラリの利用について具体的なサンプルを作成しながら説明します。