和洋風KAI

UIAlertView+UITextField表示中に通知が来た場合、キーボードの裏に隠れてしまうバグの修正方法。

Photo by : Aeturnum

こんにちは、boxcarが大好き人間、するぷ (@isloop) です。

このアプリ、公式RTが来たり、ふぁぼが来たりすると、いち早く通知してくれるのですが、そいつのせいで、するぷろ for iPhoneにバグがあることを教えてくれました・・・。

しかも、結構やっかいなんですよねぇ、このバグ・・・。内容としてはこんな感じ。

「UIAlertView + UITextFieldが表示中に、さらにキーボードがでてる間に、外部から通知がくると、それがキーボードの裏に隠れて閉じれなくなって、操作不能になる」というもの・・・。

はい。なんのこっちゃか分かりませんね。続きから画で説明します・・・。

こんな状態になってなにも手が出せなくなるorz

・・・。

うぉぉぉぉおおん! 閉じる押せねぇぇぇぇえええ!!!

というわけで、こんな感じに書いてみた。

こんなコードを書いたら回避出来たので忘備録替わりに乗せておくます。

- (void)viewWillAppear:(BOOL)animated {
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(applicationWillResignActive:) name:UIApplicationWillResignActiveNotification object:nil];
}
- (void)viewWillDisappear:(BOOL)animated {
[[NSNotificationCenter defaultCenter] removeObserver:self name:UIApplicationWillResignActiveNotification object:nil];
}
- (void)applicationWillResignActive:(NSNotificationCenter *)center{
[textField resignFirstResponder];
}

外部通知が来たら、UIApplicationWillResignActiveNotificationが拾う。

見た目はまるで同じな外部通知は、UIAlertViewの一種かとおもって、delegateを漁り尽くしたのですが、どれもブレイクポイントに引っかかってくれず・・・。

いつもありがたい助言をくれる@takatomoさんに聞いてみたら、「UIApplicationWillResignActiveNotification」が拾ってくれるかもと、またしても、ありがたい助言をしてくれまして、やってみたらバッチリでやんした! @takatomoさんマジ天使!!

UIApplicationWillResignActiveNotificationは、アプリが非アクティブになる直前にくるらしく、外部通知が来た場合や、アプリを切り替えたときに通知されるものだそうです。またひとつ勉強になりましたありがたやありがたや。

ちなみに、UIApplicationのNotificationの解説は以下のページがとても詳しかったです。

AppDelegateクラスでapplicationWillTerminate:メソッドをオーバーライドしてあると、アプリケーション終了時に当該メソッドを呼んでくれるので、後片付けなどに重宝します。

引用元:[iPhone][develop] アプリ終了時に呼ばれるメソッドをAppDelegate以外にも登録する – Ni chicha, ni limona – 平均から抜けられない僕 – iPhoneアプリ開発グループ

さて、このキーボードの裏に隠れてしまうバグは、現在申請中のver1.02で改善されます。申請してから、もうそろそろ一週間経つので、もうすぐアップデートが来ると思います。もう少しお待ちくださいませ・・・。