SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Objective-CユーザーのためのSwift入門

SwiftからObjective-Cを利用する

Objecive-CユーザーのためのSwift入門 第6回


  • X ポスト
  • このエントリーをはてなブックマークに追加

FPPopoverを利用する

 利用するライブラリが決まったら、まずObjective-Cでそのライブラリを動かせるようにします。その際にどのクラスをどのように使うかを理解して、Swiftのプロジェクトにそれらのクラスを配置します。

利用しているクラスを特定する

 FFPopoverはGitHubから入手できます。ソースコードを入手後、FPPopoverDemoディレクトリ内にObjective-Cのデモプロジェクトがあるので、Xcodeで開きます。最初に呼び出されるFPAppDelegateクラスからソースを追うと、FPViewController.mのpopover:(id)senderメソッドでポップオーバーを表示していることが分かります。該当する箇所は次の通りです。

リスト3 ポップオーバーを表示する箇所(FPViewController.h抜粋/コメント追記)
-(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ファイルを参照します。

リスト4 ヘッダファイルを参照(FPPopoverKeyboardResponsiveController.h抜粋/コメント追記)
// FPPopoverControllerクラスをインポート
#import "FPPopoverController.h"

// FPPopoverControllerクラスを継承
@interface FPPopoverKeyboardResponsiveController : FPPopoverController

 上記の通り、FPPopoverKeyboardResponsiveControllerクラスはFPPopoverControllerクラスを継承しています。そこで次は継承元のFPPopoverControllerクラスのヘッダファイルであるFPPopoverController.hファイルを参照します。

リスト5 ヘッダファイルを参照(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にヘッダファイルを記述します。

リスト6 インポートするヘッダファイル(Sample-Bridging-Header.h抜粋)
#import "FPPopoverKeyboardResponsiveController.h"
#import "FPPopoverController.h"
#import "FPPopoverView.h"
#import "FPTouchView.h"
#import "ARCMacros.h"

ポップオーバーで呼び出されるメニュー画面を作成する

 デモのプロジェクトを参照すると、ポップオーバーの内容として利用されているビューコントローラーの実態はFPDemoTableViewControllerクラスです。

リスト7 ポップオーバーの内容を指定する箇所(FPViewController.h抜粋/コメント追記)
// ポップオーバーの内部に表示するビューコントローラーのオブジェクトを生成
DemoTableController *controller = [[DemoTableController alloc] initWithStyle:UITableViewStylePlain];
controller.delegate = self;
// ビューコントローラーを指定してポップオーバーを表すクラスを初期化
popover = [[FPPopoverKeyboardResponsiveController alloc] initWithViewController:controller];

 FPDemoTableViewControllerクラスのソースを追うと、UITableViewControllerクラスを継承したテーブルビューコントローラーであることがわかります。

リスト8 FPDemoTableViewControllerクラスのヘッダファイル(FPDemoTableViewController.h抜粋/コメント追記)
// UITableViewControllerを継承
@interface FPDemoTableViewController : UITableViewController

// 特別なメソッドやプロパティは使用していない

@end

 上記の通り、FPDemoTableViewControllerクラスには特別なプロパティやメソッドはなく、UITableViewControllerクラスを継承しただけのテーブルビューコントローラーであることがわかります。

 サンプルでも同様に、UITableViewControllerクラスを継承したテーブルビューコントローラーを作成します。XcodeでUITableViewControllerクラスを継承したビューコントローラーのクラスを作成すると、DataSorceやdelegateを継承したソースコードが自動で出力されます。出力されたソースコードを以下のように補完して、簡単なテーブルビューコントローラーを作成します。

リスト8 インポートするヘッダファイル(TableViewController.h)
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のライブラリを呼び出しつつ、アプリの中でのライブラリの利用について具体的なサンプルを作成しながら説明します。

参考資料

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Objective-CユーザーのためのSwift入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、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本格入門」「これからはじめるReact実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト 片渕 彼富(カタフチ カノトミ)

WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2018年11月時点での登録メンバは55名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS Twitter: @yyamada(公式)、@yyamada/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/8641 2015/06/15 13:57

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング