SHOEISHA iD

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

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

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

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

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


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

 本連載では、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で実装できました。

会員登録無料すると、続きをお読みいただけます

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

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

メールバックナンバー

次のページ
FPPopoverのメニュー選択後の処理を指定する

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

  • このエントリーをはてなブックマークに追加
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

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

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

この記事をシェア

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

おすすめ

アクセスランキング

アクセスランキング

イベント

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

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

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

メールバックナンバー

アクセスランキング

アクセスランキング