16

UITableViewControllerNIB またはコードを介して使用される場所に応じて、インスタンス化されるサブクラスがあります。どちらの場合も、初期化メソッドでカスタマイズを行いたいと考えています。initWithNibName:bundle: つまり、 と の両方を 実装する必要がありinitWithCoder:、各メソッドはそれぞれのスーパー初期化子を呼び出すのでしょうか?

これは今は必要ありませんが、View Controller を でインスタンス化できるようにしたい場合はどうすればよいinitWithStyle:ですか? 同じ動作を再現する 3 つの異なる init メソッドが必要ですか?

基本的に、共通の init メソッドを呼び出すことのない 3 つの個別の初期化子があるため、これは指定された初期化子の規則全体に違反しているようです。または、3 つの異なるインスタンス化ルートをサポートしながら、共通の指定イニシャライザーを作成する方法はありますか?

4

5 に答える 5

11

私の混乱は、各クラスに単一の指定された初期化子が必要であるという誤った考えに基づいていました。これは真実ではなく、UITableViewController3つの指定された初期化子がある場合(私が知る限り):

  1. initWithStyle:ローカルで宣言
  2. initWithNibName:bundle:から継承UIViewController
  3. initWithCoder:NSCodingプロトコルの採用から

サブクラスがインスタンス化される方法に応じて、サブクラスでこれらの1つ以上をオーバーライドする必要があります。私の場合、クラスはNIBからロードするか、NIBを参照してコードを介してインスタンス化できるため、#2と#3を実装する必要がありました。(1つのクラスと両方initWithStyle:を使用することはめったにないと思います。)initWithNibName:bundle:

ココアのためのアップルのコーディングガイドラインは役に立ちました。

于 2009-04-16T15:14:56.880 に答える
7

初めの、

  • UITableViewController-initWithStyle:はスーパーを呼び出し、-init次にivarを設定し_tableViewStyleます。
  • UIViewControllerは、デフォルトの引数を使用して-init呼び出すだけです。-initWithNibName:bundle:
  • UITableViewControllerはをオーバーライドしません-initWithNibName:bundle:

したがって、オーバーライドすると-initWithNibName:bundle:-initWithStyle:変更も採用されます。もちろん、安全にプレイするには(実装の詳細に依存するべきではないため)、両方をオーバーライドします。

-initWithCoder:(インスタンスをアン/アーカイブしない限り、オーバーライドする必要はありません。)

于 2010-02-11T07:35:10.930 に答える
2

明確にするために、ドキュメントで公開されinitWithStyle:ているUITableViewController唯一の初期化子である は、明示的に指定された 1 つの初期化子です。

initWithNibName:bundle:UIViewController から継承され、そのクラスの指定された初期化子です。そのため、Cocoa のガイドラインに従って、このメソッドを (実装することによって) オーバーライドするUITableViewController 必要があります。ただし、これは の指定されたイニシャライザにはなりませんUITableViewController

initWithCoder:ご指摘のとおり、 は からの暗黙の指定イニシャライザですNSCoding

于 2010-02-10T18:34:15.553 に答える
0

上記の投稿への追加 –initWithCoder:

インターフェイス ビルダーを介してビュー コントローラーをその親に追加した場合 (たとえば、ビュー コントローラーがインターフェイス ビルダーのタブ バー コントローラーに接続されている場合)、–initWithCoder をオーバーライドする必要があります。

(-initWithNibName は、View Controller をプログラムで作成する場合にのみ呼び出されます。)

于 2012-01-03T17:48:00.887 に答える
0

埋め込む:

- (void) viewDidLoad

そこでコンポーネントの初期化を行います。

ビューが実際に要求されたときにのみ初期化を行うという利点があります。

または、すべてのイニシャライザによって呼び出される別のセットアップ メソッドを作成します。

于 2009-04-13T06:19:52.707 に答える