UITableViewController サブクラスをオーバーライドするイニシャライザ
-
09-09-2019 - |
質問
私は持っています UITableViewController
NIB 内またはコード経由で使用される場所に応じてインスタンス化されるサブクラス。どちらの場合も、初期化メソッドでカスタマイズを行いたいと考えています。つまり両方実装する必要があるということですか initWithNibName:bundle:
そして initWithCoder:
, 、そして各メソッドはそれぞれのスーパーイニシャライザを呼び出すのでしょうか?
現時点ではこれは必要ありませんが、ビュー コントローラーをインスタンス化できるようにしたい場合はどうすればよいでしょうか。 initWithStyle:
?同じ動作を再現する 3 つの異なる init メソッドが必要になるでしょうか?
基本的に共通の init メソッドを呼び出すことのない 3 つの個別のイニシャライザが存在するため、これは指定されたイニシャライザの規約全体に違反しているようです。それとも、3 つの異なるインスタンス化ルートをサポートしながら、共通の指定イニシャライザーを作成する方法はありますか?
解決
私の混乱は、各クラスが単一の指定された初期化子を持つべきであるという誤った信念に基づいていました。これは真実ではなく、次の場合には、 UITableViewController
(私が知る限り) 指定された初期化子が 3 つあります。
initWithStyle:
ローカルで宣言されるinitWithNibName:bundle:
から継承したUIViewController
initWithCoder:
養子縁組からNSCoding
プロトコル
1 をオーバーライドする必要があります 以上 サブクラスのインスタンス化方法に応じて、サブクラス内のこれらのうちのどれかを選択します。私の場合、クラスは NIB からロードしたり、NIB を参照するコードを介してインスタンス化したりできるため、#2 と #3 を実装する必要がありました。(両方使うことは稀だと思います) initWithStyle:
そして initWithNibName:bundle:
単一クラスの場合。)
アップルのものを見つけました Cocoa のコーディングガイドライン 役立つ。
他のヒント
内部的に、
- UITableViewControllerの
-initWithStyle:
スーパーに電話する-init
次に、_tableViewStyle
イーヴァル。 - UIViewControllerの
-init
ただ電話するだけ-initWithNibName:bundle:
デフォルトの引数を使用します。 - UITableViewController ではない オーバーライド
-initWithNibName:bundle:
.
したがって、オーバーライドすると、 -initWithNibName:bundle:
それから -initWithStyle:
も変更を採用します。もちろん、安全を期すために (実装の詳細に依存すべきではないため)、両方をオーバーライドします。
(オーバーライドする必要はありません -initWithCoder:
インスタンスを解凍/アーカイブしない限り。)
明確にするために、initWithStyle:
は、ドキュメント内UITableViewController
の唯一公表初期化され、その1つの明示的に指定イニシャライザです。
initWithNibName:bundle:
はのUIViewControllerから継承し、そのクラスの指定イニシャライザです。このように、ココアガイドラインに従って、UITableViewController
はのの(それを実装することによって)、このメソッドをオーバーライドしなければなりません。しかし、これはUITableViewController
の指定イニシャライザことはありません。
ご指摘のようinitWithCoder:
は、NSCoding
からの暗黙の指定イニシャライザです。
実装します。
- (void) viewDidLoad
とそこにあなたのコンポーネントの初期化を行います。
これは、ビューが実際に要求されたときにのみ初期化を行うことの利点を持っています。
それとも、すべての初期化子によって呼び出される別のセットアップ方法を作ります。
その基準-initWithCoder上記ポストに加え
あなたが追加した場合(例:ビューコントローラは、インターフェースビルダーでタブバーコントローラに接続されている場合)、インタフェースビルダーを経由してその親にビューコントローラを追加して、あなたは-initWithCoderオーバーライドする必要があります。
。( - あなたは、プログラムのビューコントローラを作成するときinitWithNibNameにのみ呼び出されます。)