我正在尝试使用以下代码。它会在第一次执行预期操作并打开一个窗口并使其成为前窗口,但是当后续调用它时,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
答案 0 :(得分:2)
在Interface Builder中,您需要取消选中标记为“关闭时释放”的框。如果启用此复选框,则窗口将被释放,并且可能在关闭时取消分配。
如果你想保持窗口周围,你不需要这种行为,所以你需要关闭它。
答案 1 :(得分:0)
我知道这是一个老问题,但无论如何我想回答我自己的问题。
我认为我使用静态变量和客户卡的单例不是一个好主意。
//将customerCard声明为静态变量
静态CustomerCard * customerCard;
现在在我看来,无论何时使用静态变量,都会破坏面向对象编程的目的。也许用户希望拥有多张客户卡,以便在不同的窗口中查看多个客户。
这就是我现在的想法。