ナビゲーションバーの戻るボタンをカスタマイズしたい!!

ナビゲーションバーの戻るボタンは、何もコーディングしなくていいので便利ですよね。普通に使う分には問題ないです。

しかしカスタマイズして、戻る(popViewController)前に処理を入れたい時って困ります。戻るを場合によってはキャンセルしたい場合もあります、例えば、「未保存ですが戻っても良いですか?」と出したい時などです。


ググってみるとナビゲーションバーのバックボタンを、オーバーライドすることができないという記事を発見。
http://osmorphis.blogspot.com/2009/03/trapping-uinavigationbar-back-button.html
しかーし、同じところにThree20 Frameworkを使えば似たような、見た目のボタンが使えると書いてありました。


Three20について調べてみると、オープンソースでそこそこ利用実績もある。いろんなアプリで使われてるんですね。
さっそくダウンロードしてみます。
http://three20.info/article/2010-10-06-Adding-Three20-To-Your-Project


ダウンロードしたファイルを、解凍します。
解凍したファイルより、srcフォルダだけを、組み込みたいプロジェクトxxx.xcodeprojの格納されているフォルダにコピーします。
今回の例では、/Users/xxxx/Documents/Sample02/Sample01.xcodeprojに組み込みます。



自分のプロジェクトに組み込むのは、pythonスクリプトが用意されているとのことなので、組み込みたいモジュール(Three20Style、Three20UIなど)を指定してスクリプトを実行してみます。
ターミナルを表示して、Sample01.xcodeprojの格納されているフォルダに移動。

cd /Users/xxxx/Documents/Sample02

オプションを指定して、スクリプトを実行します。

python ./src/scripts/ttmodule.py -p './Sample01.xcodeproj' -c Debug -c Release Three20UI
-pで、組み込むプロジェクトをフルパスで指定。
-cで、設定を組み込む構成を指定。

これで、プロジェクトへの組み込みは完了です。プロジェクトにThree20関連のxcodeprojが追加されているはずです。

※そのままでコンパイルするとUIViewController+TTNavigatorGarbageCollection.hヘッダーが見つからないと言われます。なぜだ!?
 仕方ないので、解凍したフォルダよりそのヘッダーファイルを探して、./src/Three20UINavigator/Headersにコピーします。


そして、Sample01.xcodeprojのヘッダー検索パスに「$(SRCROOT)/build/Products/three20」を追加で準備完了、あとは以下のように使うことができます。

#import "Three20UI/TTButton.h"

// logoff(Create the custom back button)
TTButton *backButtonView = [TTButton buttonWithStyle:@"toolbarBackButton:" title:@"back"];
[backButtonView addTarget:self action:@selector(handleBack:) forControlEvents:UIControlEventTouchUpInside];
[backButtonView sizeToFit];

UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithCustomView:backButtonView];
self.navigationItem.leftBarButtonItem = backButton;
[backButton release];

handleBackを作成して、処理をした後に前画面に戻る場合は、popViewControllerAnimatedを呼べばOKです。

組み込んだソースはこちら。
http://www.eonet.ne.jp/~einstein/iOS/design/Sample02.zip