ダウンロード サンプルファイル (10.7 MB)
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のライブラリを呼び出しつつ、アプリの中でのライブラリの利用について具体的なサンプルを作成しながら説明します。
参考資料
この記事は参考になりましたか?
既に会員の方はを行ってください。
- Objective-CユーザーのためのSwift入門連載記事一覧
-
- Objective-Cのライブラリを利用してSwiftアプリを作成する
- SwiftからObjective-Cを利用する
- SwiftでアプリのUIと画面の操作を実装する
- この記事の著者
-
山田 祥寛(ヤマダ ヨシヒロ)
静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数。
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
-
WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)
<WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書、記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook
※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です
この記事は参考になりましたか?
この記事をシェア
