10

NSWindowControllerサブクラスを使用した単純なCocoaアプリがあります。私が設定したペン先:

  • NSWindowControllerサブクラスへのファイル所有者のクラス
  • ペン先のメインNSWindowへのファイルの所有者の「ウィンドウ」アウトレット。

NSWindowControllerサブクラスのinitメソッドが呼び出されます(私はsuperと呼びます)が、何をしてもwindowDidLoadは呼び出されません。

明らかな何かが欠けているに違いありませんが、私の一生の間、それが何であるかを理解することはできません。

4

4 に答える 4

26

NSWindowController別のペン先でインスタンス化してのインスタンスを作成しようとしています。ただし、nibファイルでオブジェクトをインスタンス化する場合、オブジェクトは。を呼び出すことによって初期化され-initWithCoder:ます。

-initWithCoder:はの指定された初期化子ではないNSWindowControllerため、のインスタンスがNSWindowController実際にペン先をロードすることはありません。

インスタンスをInterfaceBuilderNSWindowControllerのファイルに配置してインスタンス化する代わりに、プログラムで作成します。MainMenu.xib

AppDelegate.h

@class YourWindowController;
@interface AppDelegate : NSObject
{
    YourWindowController* winController;
}
@end

AppDelegate.mの場合

@implementation AppDelegate
- (void)applicationDidFinishLaunching:(NSNotification*)notification
{
    winController = [[YourWindowController alloc] init];
    [winController showWindow:self];
}
- (void)dealloc
{
    [winController release];
    [super dealloc];
}
@end

YourWindowController.m

@implementation YourWindowController
- (id)init
{
    self=[super initWithWindowNibName:@"YourWindowNibName"];
    if(self)
    {
        //perform any initializations
    }
    return self;
}
@end
于 2010-04-23T03:54:16.070 に答える
14

ペン先を介してウィンドウコントローラーをインスタンス化することはまったく問題ありません。フックとして使用するのではなくwindowDidLoad、その場合はを使用することをお勧めしますawakeFromNib

于 2012-02-19T20:22:51.573 に答える
2

ウィンドウはオンデマンドでロードされる場合があります-windowで自分に送信してみてください-init。詳細については-[NSWindowController loadWindow]、ドキュメントのの説明を参照してください。

于 2010-04-23T01:58:58.400 に答える
1

あなたが書いた場合

TTEst *test3 = (TTEst *)[[NSWindowController alloc] initWithWindowNibName:@"TTEst"];

代わりに試してください

TTEst *test3 = [[TTEst alloc] initWithWindowNibName:@"TTEst"];

それは違いを生みます!もちろん、最初の行は間違いでした...

于 2016-07-06T13:15:44.410 に答える