ハマったことシリーズ 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するように変更し一見落着です。
今回は、「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するように変更し一見落着です。
0 コメント:
コメントを投稿