2012-04-01 11 views
3

私は次のコードを動作させようとしています。これは初めてのことですが、ウィンドウを開き、それをフロントウィンドウにしますが、それ以降呼び出されたときには、ウィンドウがゼロであるためorderFront:は機能しません。なぜinitWithWindowNibName:initWithNibName:から返されたNSWindowControllerオブジェクトのウィンドウフィールドが設定されていませんか?initWithWindowNibNameを実行しないウィンドウを設定するフィールド

// 
// CustomerCard.m 
// POSWonder 
// 
// Created by kaydell on 2/26/12. 
// Copyright 2012 Kaydell Leavitt. All rights reserved. 
// 

#import "CustomerCard.h" 

@implementation CustomerCard 

// declare customerCard as a static variable 
static CustomerCard* customerCard; 

+(void) show { 

    // if the customer card isn't instantiated, then instantiate it 
    if (customerCard == nil) { 
     customerCard = [[CustomerCard alloc] initWithWindowNibName:@"CustomerCard"]; 
     if (!customerCard.window) { 
      NSLog(@"Why is window nil here?"); // <<<<<<<<<<< This line gets called <<<<< 
     } 
    } 

    // show the customer card and make it the front window 
    [customerCard showWindow:self]; 
    [customerCard.window orderFront:self]; // <<<<<<<< This line doesn't seem to do anything 

} 

-(void) dealloc { 
    customerCard = nil; 
    [super dealloc]; 
} 

@end 

答えて

0

私はこれが古い質問であることを知っていますが、とにかく私自身の質問に答えたいと思っていました。

  • 私は、静的変数とシングルトンをカスタマーカードに使用するのは良い考えではないと思います。

    // customerCardを静的変数として宣言します。
    static CustomerCard * customerCard;

静的変数を使用するときはいつでも、オブジェクト指向プログラミングの目的を破っているようです。たぶん、ユーザーは複数のカスタマーカードを持っていて、異なるウィンドウで複数のカスタマーを表示したいと思うかもしれません。

  • "show"というクラスメソッドを使用して、常に同じ顧客カードを表示するという私の考えは良い考えでもありません。 「File」メニューから「New Customer Card」を選択するか、「Window」メニューを使用して既存のCustomer Cardに戻ることができるようになりました。

これは私が今考えていることです。

2

Interface Builderでは、「リリース時に解放」というラベルのチェックボックスをオフにする必要があります。このチェックボックスを有効にすると、ウィンドウが解放され、閉じられたときにウィンドウが解放される可能性があります。

ウィンドウを邪魔しないようにするには、この動作を望まないので、オフにする必要があります。

+0

私はウィンドウを閉じなかった。他のウィンドウが作成され、フロントウインドウになりました。私はちょうどコードで、顧客のカードを再びフロントウィンドウにすることができるようにしたい。 – Kaydell

関連する問題