2

別のウィンドウでボタンをクリックして開きたい NSWindow xib ファイルを作成しました。

ここで、NSWindow の動作を制御するために、xib の Library からオブジェクトをドラッグし、XCode で定義した NSWindowController (つまり ListingWindowController) のサブクラスに変更しました。

同様に、NSWindow 内の NSView を管理するために、NSViewController のサブクラス (つまり、ListingViewController) も作成しました。これを行うために、xib の Library から NSViewController をドラッグし、そのクラスを ListingViewController に変更しました。

@class ListingViewController;

@interface ListingWindowController : NSWindowController {
    IBOutlet ListingViewController *listingVC;
}

@property (nonatomic, retain) IBOutlet ListingViewController *listingVC;
@end

IBでウィンドウコントローラーのウィンドウとlistingVCを接続しました。

起動 (最初の) ウィンドウでボタンをクリックしてこのウィンドウを呼び出すには、次のように initWithWindowNibName を使用してウィンドウ コントローラーを作成します。

- (IBAction) pushConnect:(id)sender {
    NSLog(@"Connect pushed.");
    if (wc == nil) {
        wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow" owner:self];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeWindow:) name:NSWindowWillCloseNotification object:nil];

        [wc showWindow:sender];
    }
}

問題は、今後のウィンドウ/ビューのビュー コントローラーに対して IB ですべてのバインドが行われているにもかかわらず、新しいウィンドウが読み込まれた後でも、ウィンドウとリスティング VC が (null)、(null) になることです (コードの下)。

- (void)windowDidLoad {
    [super windowDidLoad];

NSLog(@"windowDidLoad = %@, %@", self.window, self.listingVC);
}

接続が機能しない理由を教えてください。私はかなり長い間、この問題に頭を悩ませています。

PS: 私は iOS プログラミングのバックグラウンドを持っています。したがって、Mac のウィンドウ/ビュー コントローラーは iOS の UIViewController と同様に動作すると想定しています。

ティア..

4

1 に答える 1

11

ご了承ください:

wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow" owner:self];

self(あなたの質問の内容は明確ではありませんself) が の所有者であることを意味しますListingWindow.nib。これはself、その nib ファイル内のオブジェクトへのアウトレットを保持し、nib ファイル内selfの最上位オブジェクトを解放する責任があることを意味します。これは、クラスのオブジェクトを nib ファイルにドラッグしたためListingWindowController、コード内に のインスタンスを作成し、nib ファイル内にのインスタンスを作成していることも意味しListingWindowControllerます。

これは本来あるべき姿ではありません。

ほとんどの場合、ウィンドウ (ビュー) コントローラーが nib ファイルをロードし、その所有者になります。nib ファイルの最上位ウィンドウ (ビュー) にリンクする必要があるwindow( ) アウトレットがあります。viewnib ファイルの所有者であるため、nib ファイルがロードされる前に作成されている必要があります。

ウィンドウ コントローラでこれを実現するには、ファイルの所有者クラスを に設定する必要がありますListingWindowController。オブジェクト キューブをドラッグして、nib ファイル内でウィンドウ コントローラーをインスタンス化してはなりません。ウィンドウ コントローラは nib ファイルの所有者であるため、nib ファイルがロードされる前に存在している必要があります。windowまた、ファイルの所有者のアウトレットを nib ファイルの最上位のウィンドウ オブジェクトにリンクして、ウィンドウ コントローラがどのウィンドウを管理する必要があるかを認識できるようにする必要があります。

それを行ったら、次を使用します。

wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow"];

それ以外の:

wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow" owner:self];

wcnibファイルの所有者であることになっているので。

ビュー コントローラーも同様に機能します。それらはnibファイルをロードする前に作成され、トップレベルオブジェクトとしてビューを含むnibファイルをロードする責任があり、そのnibファイルの所有者であり、viewそのトップレベルビューにリンクされなければならないアウトレットを持っています.

ビュー用に別のnibファイルがあるかどうかは、あなたの質問からは明らかではありません。そうでない場合は、 のサブクラスを使用するNSViewController必要はまったくありませんNSObject。代わりに のサブクラスを使用できます。NSViewController別のnibファイルからロードされていないビューを管理するために使用することを主張する場合は-loadView、nibファイルからロードして送信する以外の方法でビューへの参照を取得するように-setView:オーバーライドする必要があります。管理しているはずのビューを認識しています。

推奨される読書:リソース プログラミング ガイドの Nib ファイルNSWindowController クラス リファレンスNSViewController クラス リファレンス

于 2011-05-29T22:36:04.300 に答える