16

ビュー階層構造の多くを IB に移行し始めています。

「AlignmentViewController.xib」という名前の nib ファイルがあり、ファイルの所有者として AlignmentViewController を使用してビュー階層を設定します。これはうまくいきます。

私が曖昧なままにしているメソッドの 1 つは、awakeFromNib です。次の AlignmentViewController のコード スニペットでは、awakeFromNib メソッドを 1 つ追加します。ただし、呼び出されません。

- (void)awakeFromNib {

   NSLog(@"AlignmentViewController - awakeFromNib");
   [super awakeFromNib];

}

- (id)initWithChromosomeName:(NSString *)chromosomeName 
               basepairStart:(NSUInteger)basepairStart 
                 basepairEnd:(NSUInteger)basepairEnd {

    self = [self initWithNibName:@"AlignmentViewController" bundle:nil];

    if (nil != self) {


        self.title          = @"Alignment";

        self.chromosomeName = chromosomeName;
        self.basepairStart  = basepairStart;
        self.basepairEnd    = basepairEnd;

        self.wantsFullScreenLayout = YES;

    }

    return self;
}

ここで見逃したことを誰かが明確にしてくれますか?

乾杯、ダグ

更新:いくつかの回答を読んだ後、かなり基本的なことの根底に到達する必要があることに気付きました。

初期化を見る:

- (id)initWithChromosomeName:(NSString *)chromosomeName 
               basepairStart:(NSUInteger)basepairStart 
                 basepairEnd:(NSUInteger)basepairEnd {

    self = [self initWithNibName:@"AlignmentViewController" bundle:nil];

initWithNibName:bundle: を間接的に呼び出していることに気付きました。これは悪い習慣ですか?AlignmentViewController.xib ファイルは、ビュー階層を定義します。しかし、私は initWithNibName:bundle: を通常の方法で実際に使用していませんか? これを行うより良い方法はありますか?

4

4 に答える 4

38

-awakeFromNibすべてのペン先オブジェクトがインスタンス化された後、ペン先からインスタンス化されるすべてのオブジェクトに送信されます。所有者はそれらのオブジェクトの1つではありません。ペン先を逆シリアル化する前に存在し、ロード後にペン先に配線されるため、送信されません-awakeFromNib(もちろん、他のペン先自体によってインスタンス化されない限り)。

ここでの1つの手がかりは、両方を呼び出す方法はなく、両方-initFromChromosomePair:basepairStart:basepairEnd:-awakeFromNib呼び出すことができるということです。ニブローダーは常に-initWithCoder:-initWithFrame:またはを呼び出します-init(送信されるルールはニブオブジェクトのライフサイクルにあります)。他の指定された初期化子があるという事実は、コードのどこかにこのオブジェクトを手動で作成していることを強く示唆しています。つまり、このオブジェクトは「ペン先から目覚めた」わけではありません。

于 2009-10-19T14:09:43.317 に答える
35

明確化を追加するだけです: -awakeFromNib は Cocoa のファイルの所有者に送信されますが、Cocoa Touch には送信されません。

Appleのドキュメントから:

...

  • 一致するセレクターを定義する nib ファイル内の適切なオブジェクトに awakeFromNib メッセージを送信します。
    • Mac OS X では、このメッセージは、メソッドを定義するすべてのインターフェイス オブジェクトに送信されます。また、ファイルの所有者とそれを定義するすべてのプロキシ オブジェクトにも送信されます。
    • iPhone OS では、このメッセージは nib ロード コードによってインスタンス化されたインターフェイス オブジェクトにのみ送信されます。File's Owner、First Responder、またはその他のプロキシ オブジェクトには送信されません。
于 2010-02-03T23:16:44.827 に答える
2

あなたが私たちに言ったことに基づいて、私はあなたの問題が何であるかを知っていると信じています. awakeFromNibオブジェクトが nib ファイルからデシリアライズされるときに呼び出されます。ここには、nib がロードされるに存在する所有者であるオブジェクトがあります。したがってawakeFromNib、あなたのAlignmentViewController.h.

ここで何かをする必要がある場合は、loadView代わりに を使用してみてください。または、ペン先をロードした後に実行します。あなたがそれをやりたかったのは何をしようとしているのawakeFromNibですか?

于 2009-10-19T14:21:26.617 に答える