ナビゲーションバーの戻るボタンをカスタマイズしたい!!
ナビゲーションバーの戻るボタンは、何もコーディングしなくていいので便利ですよね。普通に使う分には問題ないです。
しかしカスタマイズして、戻る(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