不是initWithWindowNibName设置窗口字段

时间:2012-04-01 23:50:11

标签: cocoa nswindow nswindowcontroller

我正在尝试使用以下代码。它会在第一次执行预期操作并打开一个窗口并使其成为前窗口,但是当后续调用它时,orderFront:不起作用,因为窗口为零。为什么initWithWindowNibName:没有设置从NSWindowController返回的initWithNibName:对象的窗口字段?

//
//  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

2 个答案:

答案 0 :(得分:2)

在Interface Builder中,您需要取消选中标记为“关闭时释放”的框。如果启用此复选框,则窗口将被释放,并且可能在关闭时取消分配。

如果你想保持窗口周围,你不需要这种行为,所以你需要关闭它。

答案 1 :(得分:0)

我知道这是一个老问题,但无论如何我想回答我自己的问题。

  • 我认为我使用静态变量和客户卡的单例不是一个好主意。

    //将customerCard声明为静态变量
    静态CustomerCard * customerCard;

现在在我看来,无论何时使用静态变量,都会破坏面向对象编程的目的。也许用户希望拥有多张客户卡,以便在不同的窗口中查看多个客户。

  • 我使用类方法的想法:“show”,总是显示相同的客户卡,也不是一个好主意。我认为现在用户可以自由选择“文件”菜单中的“新客户卡”,或使用“窗口”菜单返回现有客户卡。

这就是我现在的想法。