はじめに
前回はSwiftからObjective-Cを呼び出す基本的な方法、Objective-CのライブラリFFPopoverの導入方法について説明しました。連載第7回では、SwiftにFFPopoverを組み込む具体的な方法、Swiftで定義したデリゲートとの連携について説明します。作成するサンプルは前回に続き次の通りです。
対象読者をObjective-Cが分かる方としている関係上、Objective-C自体の言語仕様やXcodeの使い方については解説を割愛する場合があることをご了承ください。同様にSwift自体の説明も必ずしも十分でない場合があります。そのような場合は末尾の参考文献等を参照してください。
対象読者
本記事は、次の方を対象にしています。
- Objective-Cの基本的なプログラムが出来る方
- Xcodeを使える方
SwiftからFPPopoverを呼び出す
SwiftからFPPopoverのポップオーバーを呼び出す部分を作成します。前回と同様に、最初にObjective-Cではどのようにポップオーバーを呼び出しているかを確認した後に、Swiftで呼び出すコードを作成していきます。
Objective-Cのファイルでポップオーバーを呼び出す部分を確認する
FPPopoverのデモプロジェクトを参照して、FPPopoverを呼び出している箇所を確認します。FPAppDelegate.mからソースを追うと、FPViewController.m内で、次のようにFPPopoverKeyboardResponsiveControllerクラスを初期化して呼び出していることが分かります。
-(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クラスを呼び出す際には次の処理を行っていることが分かります。
- 初期化時にポップオーバー内にメニューとして表示するテーブルビューコントローラーを指定
- tintプロパティでポップオーバーの枠の色を指定
- keyboardHeightプロパティでキーボード表示時の位置を調整
- contentSizeプロパティでポップオーバーのサイズを指定
- arrowDirectionプロパティでポップオーバーの出力元の矢印の向きを指定
SwiftからFPPopoverKeyboardResponsiveControllerクラスを呼び出してポップオーバーを生成する際にも、同様の処理を行うことになります。ただし、SwiftからObjective-Cを呼び出す際には、メソッドをSwiftのメソッドの呼び出し方に変更しなければなりません。メソッドの変更については次項で説明します。先に必要なプロパティを確認します。上記の中でkeyboardHeightプロパティはキーボードの位置をポップオーバーの位置に反映させるものであり、サンプルでは利用しません。tintプロパティ/arrowDirectionプロパティで指定できる値については、FPPopoverView.hファイルで次のように定義されています。
// 枠の色の定義 typedef enum { FPPopoverBlackTint, // 黒 FPPopoverLightGrayTint, // 灰色 FPPopoverGreenTint, // 緑 FPPopoverRedTint, // 赤 FPPopoverDefaultTint = FPPopoverBlckTint // 規定では黒 } FPPopoverTint;
typedef enum FPPopoverArrowDirection: NSUInteger { FPPopoverArrowDirectionUp = 1UL << 0, // 上向き FPPopoverArrowDirectionDown = 1UL << 1, // 下向き FPPopoverArrowDirectionLeft = 1UL << 2, // 左向き FPPopoverArrowDirectionRight = 1UL << 3, // 右向き FPPopoverNoArrow = 1UL << 4, // 指定しない ...中略... } FPPopoverArrowDirection;
連載第5回で「属性を示すオブジェクト」に関してSwiftでは[広義の属性].[詳細]と説明しました。ですが、例外的にObjective-Cのクラスを利用する場合は、Objective-Cの属性の定義のままで利用できます。
SwiftからFPPopoverを呼び出す
前項で確認したObjective-CでのFPPopoverを呼び出す処理を、Swiftに記述していきます。最初にボタンを押した際の処理を次のように記述します。
override func viewDidLoad() { ...中略... button.addTarget(self, action: "onPush:", forControlEvents:.TouchUpInside) }
連載第5回で説明したように、addTarget(_:action:forControlEvents:)メソッドでボタンが押された際にonPushメソッドが呼ばれるようにしています。onPushメソッドの中でポップオーバーを表示します。Objective-CのFPPopoverKeyboardResponsiveControllerクラスを初期化している部分を次のようにSwiftの書式に書き換えます。
// ボタンを押した際の処理 func onPush(sender:UIButton) { // ポップオーバー内に表示するテーブルビューコントローラーを初期化 var tableViewController : TableViewController = TableViewController(nibName : nil, bundle : nil) // FPPopoverKeyboardResponsiveControllerを初期化 popover = FPPopoverKeyboardResponsiveController(viewController:tableViewController) as FPPopoverKeyboardResponsiveController // 枠の色に規定の色を指定 popover.tint = FPPopoverDefaultTint; // ポップオーバーのサイズを指定 popover.contentSize = CGSizeMake(200, 300); // ポップオーバーを表示する際の矢印の向きを指定 popover.arrowDirection = FPPopoverArrowDirectionAny; // ポップオーバーを表示 popover.presentPopoverFromView(sender); }
FPPopoverKeyboardResponsiveControllerクラスの初期化処理の部分は、Swiftの書式に合わせて変更します。Swiftでの初期化処理はinitメソッドに統一されていますので、Objective-CのinitWith~メソッドの~の部分がinitメソッド内のラベルとして読み変えます。サンプルでは、initWithViewController:controllerのメソッドをinit((viewController:controller) と書き換えています。
プロパティに関しては、Objective-Cのときのまま利用できます。ポップオーバーを表示するpresentPopoverFromViewメソッドに関しては、引数がsenderのみなのでラベルなしでそのままメソッドの引数にします。サンプルの実行結果は次の通りです。
![ポップオーバーの表示](http://cz-cdn.shoeisha.jp/static/images/article/8724/8724_002.gif)
Swiftの画面から、FPPopoverを使ってポップオーバーはObjective-C、ポップオーバーの中のメニュー画面はSwiftで実装できました。