1

ボタンがクリックされたときにポップアップウィンドウを作成することを目的としたアプリケーションがあります。ポップアップウィンドウはnibファイルからロードされます。そして、ボタンがクリックされ、ウィンドウが楽しくポップアップします。ただし、そのawakeFromNibメソッドは2回呼び出されます。これがコードです。

アプリケーションデリゲート:

...

-(IBAction)myButton:(id)sender{

    printf("[settings]: button pressed\n");

    Config_SelectorSetup *selectorSetup = [[Config_SelectorSetup alloc] initWithWindowNibName:@"Config_SelectorSetup"];

    printf("about to load\n");

    [[selectorSetup window] makeKeyAndOrderFront:sender];

}

Config_SelectorSetup.m

- (id) initWithWindowNibName:(NSString *)windowNibName{

    printf("[initWithWindowNibName]\n");

    if( self = [super initWithWindowNibName:windowNibName] ){

        ...

    }

    return self;

}

- (void)awakeFromNib{

    printf("[awakeFromNib]\n");

    [self startScreen];
}

そしてここに出力があります:

[settings]: button pressed
[initWithWindowNibName]
about to load
[awakeFromNib]
[awakeFromNib]

コールスタックを分析します。最初は。[NSObject performSelector:]によって2番目に呼び出され[NSIBObjectData nibInstantiateWithOwner:topLevelObjects:]ます。

誰かが私が間違っていることを教えてもらえますか?

ありがとう

4

3 に答える 3

3

ファイルの所有者以外のオブジェクトがConfig_SelectorSetup.xib含まれていますか?Config_SelectorSetup

ログインselfしてみてくださいawakeFromNib-

NSLog(@"self = %p", self);

毎回同じアドレスを出力しますか?異なるアドレスを印刷しているConfig_SelectorSetup場合は、ペン先にオブジェクトがある可能性があります。

于 2012-02-15T03:49:24.403 に答える
1

クラスにはいくつのアウトレットがあり、そのクラスのサブクラス化は何ですか?特定のサブクラス(NSDocumentたとえば)で、複数のアウトレットが接続されている場合、各ペン先オブジェクトはawakeFromNibロード時にメソッドを起動することがわかりました。NSLogアウトレットは、nilまたはアドレスを出力するかどうかを確認します。

于 2012-02-15T03:59:11.193 に答える
1

ペン先からオブジェクトを作成し、所有者としてNSWindowControllerを指定すると、ウィンドウコントローラーはawakeFromNibを取得します。たとえば、一般的なケースは、コントローラーがNSTableViewとメソッドのデリゲートである場合です。

(NSView *)tableView:(NSTableView *)tableView viewForTableColumn:(NSTableColumn *)tableColumn row:(NSInteger)row

このような見方をしている、

return [tableView makeViewWithIdentifier:tableColumn.identifier
                                                      owner:self];

self(ウィンドウコントローラー)が所有者として渡される方法に注意してください。これにより、この行が実行されるたびにawakeFromNibメッセージが表示されます。この場合、所有者としてnilを渡す方が適切であり、ここでテーブルセルビューのawakeFromNibを取得することに依存しないでください。

あなたのケースで所有者として指定されたコントローラーでどのオブジェクトが作成されているかはわかりませんが、これで正しい方向に進むはずです。

于 2021-10-29T18:32:44.430 に答える