工場裏のアーカイブス

素人によるiPhoneアプリ開発の学習記

ポップアップするビューの作り方(2、Swift編)

※本記事はポップアップするビューの作り方(1)の続きとなります。

Swift で MJPopupViewControllerを使ってみる

最近は Swift にも触ってみたのですが、Objective-C に比べると個人的には色々書きやすく、参考にしている情報サイトなどもソースコードSwiftに移行している所がちらほらありますので、私も今後はSwift使いに転向しようと考えております。

ただしSwfitにはObjective-Cと互換性があり、Objective-Cで書かれたコードをSwiftから呼び出して利用することは容易に行えるそうです。そこで本記事では、前記事で紹介したMJPopupViewController(Objective-Cのコード)を、Swiftで利用してみたいと思います。
 

  • まずXcode(本記事ではVer 6.1)で、新しい「Single View Application」のプロジェクトを作成します(下図のように、言語をSwiftにするのを忘れずに)。

f:id:fleron:20150112165639p:plain

  • 前記事と同様に、MJPopupViewController の「source」フォルダに入っていた4ファイルをプロジェクトに追加します。ここで、SwiftのプロジェクトにObjective-Cのファイル(.m)を初めて追加するときには、下図のようなダイアログが表示されて、YESを選択すると「(プロジェクト名)-Bridging-Header.h」という名前のヘッダファイルが自動生成されます。これは「ブリッジングヘッダ」といい、Objective-Cファイル側の情報をSwiftへ橋渡しするためのものです。

f:id:fleron:20150112170806p:plain

  • ※プロジェクトにObjective-Cのファイルを「Add Files to 〜」のメニューから追加した場合、ダイアログが表示されずブリッジングヘッダが生成されないようです。この場合は自力でブリッジングヘッダを作成することになります。プロジェクトにヘッダファイル(名前は何でもOK。例えば「Bridging-Header.hなど」)を追加し、下図のようにプロジェクト設定の「Build Settings」の「Swift Compiler - Code Generation」にある「Objective-C Bridging Header」項目に、追加したヘッダファイルの名前を指定すればOKです。

f:id:fleron:20150112172258p:plain

  • ブリッジングヘッダでは、Swiftから呼び出したいObjective-Cコード用のヘッダファイルをインポートします。MJPopupViewControllerの場合は、以下の2つが必要となります。これだけでコード呼び出しの前準備はほぼ完了です。
#import "MJPopupBackgroundView.h"
#import "UIViewController+MJPopupViewController.h"

  • あとはプロジェクトにxibファイル、および操作用ビューコントローラーのファイルを追加して、ポップアップさせるUIView関連の設定を行います。この手順は前記事と同様です(ただしビューコントローラーのファイルは、当然Swiftコードで作成することを忘れずに)

  • これで、SwiftでもMJPopupViewControllerを利用する準備は全て整いました。あとはポップアップビューを呼び出したい場所で、以下のコードを実行するだけです。ブリッジングヘッダを用意さえしておけば、それ以上の特別な設定は必要なく、プロジェクト内のどのSwiftコードからでも呼び出すことが可能です。
//Swift版 MJPopupViewControllerの呼び出し
let popupView = PopupViewController(nibName:"PopupView", bundle:nil)
presentPopupViewController(popupView, animationType:MJPopupViewAnimationSlideBottomBottom)

 

  • ここで、前記事Objective-C版のコードと比較してみます。Objective-Cで定義されたクラスやメソッドを、そのままSwiftの文法で呼び出して利用出来ている様子が良く分かると思います。
//Objective-C版 MJPopupViewControllerの呼び出し
PopupViewController *popUpView = [[PopupViewController alloc]initWithNibName:@"PopupView" bundle:nil];
[self presentPopupViewController:popUpView animationType:MJPopupViewAnimationSlideBottomBottom];