2014年5月21日水曜日

ハマったことシリーズ No11.

今回は、「UIViewControllerは、まず消える!?」です。  プログラマ以外の方には、意味不明のお話です。

自分の画面のためのクラスは、UIViewControllerを継承して作るお作法ですよね?
その元のUIViewControllerの標準メソッドの (void)viewWillDisappear:(Bool)animated のお話。

これ、画面が表示されるときに viewDidLoadの後に呼ばれることがあるのです。 ていうか自分で呼んでましたww。当然、通常は呼ばれないようですが、拾ってきたカスタムセグウェイの中で、一度rootViewControllerに設定して回転方向の修正をし、再度独自トランジッションをかけていたのです。

これでハマリました。

viewDidLoadで、addObserver: forKeyPath: options: context でオブザーバ追加し、
viewWillDisappearで、removeObserver: forKeyPath:でオブザーバ削除をしていたのですが、
待てど暮らせど、observerValueForKeyPath: ofObject: change: context: が呼ばれない。

そりゃそうです。 追加した直後に削除してりゃ、呼ばれるわけない。
設定してないときに removeObserverすると例外で落ちるので、フラグを使って設定してなければremoveObserverを呼ばないようにしていたので発見が遅れました。

原因が分かれば対処は簡単。viewDidAppearで addObserverするように変更し一見落着です。

Tagged: ,

0 コメント: