Shoeisha Technology Media

CodeZine(コードジン)

記事種別から探す

Objective-Cのライブラリを利用してSwiftアプリを作成する

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

  • LINEで送る
  • このエントリーをはてなブックマークに追加
2015/06/10 14:00

 本連載では、Objective-Cの基本的なプログラムが出来る読者を対象に、Swiftを使ってアプリを開発する際の基本的な事柄を解説します。Objective-CもSwiftもC言語を母体としたプログラム言語なので両者に共通する概念は非常に多いです。Objective-CとSwiftとの最低限度の違いを踏まえつつ、Swiftでのアプリ開発にシフトして行けるような内容を、サンプルを交えながら解説します。今回は、SwiftにObjective-Cのライブラリを利用して、アプリを作成する方法について説明します。

目次

はじめに

 前回は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クラスを初期化して呼び出していることが分かります。

リスト1 ポップオーバーを表示する箇所(FPViewController.m抜粋/コメント追記)
-(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ファイルで次のように定義されています。

リスト2 tintプロパティで指定できる枠の色(FPPopoverView.h抜粋/コメント追記)
// 枠の色の定義
typedef enum {
    FPPopoverBlackTint,          // 黒
    FPPopoverLightGrayTint,   // 灰色
    FPPopoverGreenTint,         // 緑
    FPPopoverRedTint,             // 赤
    FPPopoverDefaultTint = FPPopoverBlckTint   // 規定では黒
} FPPopoverTint;
リスト3 arrowDirectionプロパティで指定できる矢印の向き(FPPopoverView.h抜粋/コメント追記)
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に記述していきます。最初にボタンを押した際の処理を次のように記述します。

リスト4 ボタンを押した際の処理(ViewController.swift抜粋)
override func viewDidLoad() {
...中略...
    button.addTarget(self, action: "onPush:", forControlEvents:.TouchUpInside)
}

 連載第5回で説明したように、addTarget(_:action:forControlEvents:)メソッドでボタンが押された際にonPushメソッドが呼ばれるようにしています。onPushメソッドの中でポップオーバーを表示します。Objective-CのFPPopoverKeyboardResponsiveControllerクラスを初期化している部分を次のようにSwiftの書式に書き換えます。

リスト5 ポップオーバーを表示(ViewController.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のみなのでラベルなしでそのままメソッドの引数にします。サンプルの実行結果は次の通りです。

ポップオーバーの表示
ポップオーバーの表示

 Swiftの画面から、FPPopoverを使ってポップオーバーはObjective-C、ポップオーバーの中のメニュー画面はSwiftで実装できました。


  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

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

    <WINGSプロジェクトについて> 有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。2017年5月時点での登録メンバは52名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂き...

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

    静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for ASP/ASP.NET。執筆コミュニティ「WINGSプロジェクト」代表。 主な著書に「入門シリーズ(サーバサイドAjax/XMLD...

バックナンバー

連載:Objective-CユーザーのためのSwift入門
All contents copyright © 2005-2017 Shoeisha Co., Ltd. All rights reserved. ver.1.5