試行錯誤メモです。
動くことには動きますが、動作の保証は一切できません
=====
課題
すべてのcontrollerに処理を追加したい。
例えば、Controller表示前にログを出したい、とか。
(今回は、すべてのviewWillAppearの前に、毎回Firebaseの値を確認したかった。)
方法
UIViewControllerをカテゴリ拡張してメソッドをオーバーライドする
UIViewController+Addition.m (ファイル名に+、初めて使った)
@implementation UIViewController (Addition)
-(void)viewWillAppear:(BOOL)animated{
// なんやかんや
}
-(void)viewDidLayoutSubviews{
// なんやかんや
}
// ※ 参考 : [UIViewControllerのライフサイクル](http://qiita.com/motokiee/items/0ca628b4cc74c8c5599d)
調査
Warning“category is implementing a method which will also be implemented by its primary class”
“category is implementing a method which will also be implemented by its primary class”
というWarningがでる。
消したい場合は下記参考。(試してない)
カテゴリで既存メソッドを拡張しようとすると表示されるwarningの対応
動作viewWillAppear
動くことは動くが、オーバーライドすることで元の処理が呼ばれなくなってしまうため、何が起こるかわからない。
(ちょっと触った感じは普通に動いていたけれど)
viewWillLayoutSubviews / viewDidLayoutSubviews Your view controller can override this method to make changes after the view lays out its subviews. The default implementation of this method does nothing.
Your view controller can override this method to make changes after the view lays out its subviews. The default implementation of this method does nothing.
※ 引用 : viewDidLayoutSubviews – UIViewController | Apple Developer Documentation
viewWillAppearと違い、
viewWillLayoutSubviews / viewDidLayoutSubviewsは、オーバーライド可能なメソッド。
しかし、関数名の通り「Controllerが表示されるごと」ではなく、「SubViewが表示されるごと」に呼ばれるので、とても鬱陶しい。
結論
できることはできる。
が、今回は毎回処理を追加することは諦めて、アプリ起動時のみ、処理を入れるように仕様の方を変更しました。
コメント