TOKOROM BLOG

iOSとかVimとかその他日々の雑多な技術情報

提供するXXXViewControllerの親クラスを差し替え可能にしたい! はてなブックマーク - 提供するXXXViewControllerの親クラスを差し替え可能にしたい!

Permalink

XXXViewControllerの親クラスを差し替えたいときありますよね?

UIKit内で言えばUITableViewControllerとかはその代表格。
外部ライブラリで言うと、Google Analytics SDKのGAITrackedViewControllerとか。

要するに、XXXViewControllerの継承して実現したい機能があるのに、既にYYYViewControllerのサブクラスなので使えないよーとなってしまうケース。

で、既存のものは置いておくとしても、自分が作るライブラリのXXXViewControllerについては、なんとかその親クラス差し替えの需要に応えられないものかなあと。

runtime使う?

いちおう class_setSuperclassという関数があるのですがDeprecated… なんか良い方法ないかな?と考えた結果、今のところ以下のかんじに落ち着きました。

define!

後から動的に差し替えるってのは class_setSuperclass がDeprecatedな時点で諦めるとして、だとするとコンパイル前に差し替えるしかないよねと。

例えば、こんなかんじでどうでしょう?

1
2
3
4
5
6
7
8
9
10
11
12
13
#ifdef XXXLIB_VIEW_CONTROLLER_IMPORT
#import XXXLIB_VIEW_CONTROLLER_IMPORT
#endif

#ifdef XXXLIB_VIEW_CONTROLLER_SUPER_CLASS
@interface TKRContainerTableViewController : XXXLIB_VIEW_CONTROLLER_SUPER_CLASS
#else
@interface TKRContainerTableViewController : UIViewController
#endif

// ...

@end

ふつうに使うぶんには XXXLIB_VIEW_CONTROLLER_IMPORTXXXLIB_VIEW_CONTROLLER_SUPER_CLASS も定義されていないので普通にUIViewControllerがsuperclassになります。

もしsuperclass変えたいよ!って人は、

1
2
#define XXXLIB_VIEW_CONTROLLER_IMPORT "YourSuperViewController.h"
#define XXXLIB_VIEW_CONTROLLER_SUPER_CLASS YourSuperViewController

とどこかで定義してやればsuperclassがYourSuperViewControllerになるイメージです。
ひとまずこれでなんとかなりそう。

他に良い方法があればご教示を!

Comments