常に同じルート コントローラーで始まる UINavigationController のサブクラスを作成したいと考えています。特別なことは何もないので、(私にとって)次のように init メソッドをオーバーライドすることは完全に理にかなっています。
- (id) init {
rootController = [[MyController alloc] init];
if (self = [super initWithRootViewController:rootController]) {
// do some more initialization
}
return self;
}
[super initWithRootViewController] は [UINavigationController init] を呼び出すため、これは明らかに問題を引き起こします。これはもちろんオーバーライドされた init メソッドであるため、無限再帰が発生します。
「initCustom」のような別の名前の init メソッドを作成したくありません。
現在、思いつく解決策は 1 つしかありませんが、この種のハックは本当に嫌いです。
- (id) init {
if (initCalled)
return self;
initCalled = YES;
rootController = [[MyController alloc] init];
if (self = [super initWithRootViewController:rootController]) {
// do some more initialization
}
return self;
}
私の質問は次のとおりです。これを処理するより良い方法はありますか? 非常に明白な何かが欠けていると確信していますが、それはわかりません。
編集:以下の私のコメントの1つに見られるように、私がこれをやりたい理由:
常に特定のビュー コントローラーで始まるナビゲーション コントローラーを作成したいと考えています。これをクラスの消費者から隠したい。公開する必要のないものを公開する必要はありません。生活がずっと楽になり、コードがずっときれいになります (カプセル化が発明された理由の 1 つですよね?)