[iOS] すべてのcontrollerに処理を追加

iOS
スポンサーリンク
こんにちは。 雑食会社員🐼くま子です

試行錯誤メモです。
動くことには動きますが、動作の保証は一切できません

=====

スポンサーリンク

課題

すべての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”

という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.

※ 引用 : viewDidLayoutSubviews – UIViewController | Apple Developer Documentation

viewWillAppearと違い、
viewWillLayoutSubviews / viewDidLayoutSubviewsは、オーバーライド可能なメソッド。
しかし、関数名の通り「Controllerが表示されるごと」ではなく、「SubViewが表示されるごと」に呼ばれるので、とても鬱陶しい。

結論

できることはできる。

が、今回は毎回処理を追加することは諦めて、アプリ起動時のみ、処理を入れるように仕様の方を変更しました。

コメント