2011-03-04 97 views
0

嘿家伙, 我认为这将是一件非常简单的事情,但事实证明比我想象的要复杂。按需显示NSPanel - NSPanel没有显示?

我希望能够显示NSPanel,它显示一个圆形的进度条和正在处理的事物的名称。

所以,我在IB中创建了一个包含这些控件的NSPanel,然后我创建了一个NSWindowController的子类。为控件创建网点并将其链接起来。

然而,当我尝试使用这个代码以显示NSPanel,没有任何反应:

 [[[self controller] msgSubject] setValue:[msg subject]]; 
     [[[self controller] window] setLevel:NSFloatingWindowLevel]; 
     [[self controller] showWindow:self]; 
     [[[self controller] window] makeKeyAndOrderFront:self]; 

[自控制器]是懒惰地实例化NSWindowController子类的方法。我尝试添加对makeKeyAndOrderFront的调用:徒劳,但面板仍然没有弹出。

我试过调试,我发现当调用-initWithWindow:时,作为参数传入的NSWindow已全部清零实例变量,导致我相信这里会出现某种IB链接问题。

任何想法?我猜我错过了一些非常明显的事情,但我不能为了我的生活而弄清楚它是什么。

回答

0

请发布[自我控制器]方法的内容,以便我们可以开始详细了解如何创建和使用NSWindowController子类。您是直接使用initWithWindow:方法创建它,还是从其他init方法之一间接调用该方法(它是指定的初始化程序)?如果你直接调用它,那对我来说没有意义,因为你说你已经在nib文件本身创建了窗口。如果另一方面,它被-initWithWindowNibName:间接调用,那么它将有助于查看该代码。

NSWindowController的主要使用/设置有两种不同的方式。一种方法是以编程方式创建NSWindow,然后创建NSWindowController子类,并将该窗口作为控制器将管理的窗口输入。第二种,也是比较常用的方法,是创建一个容纳窗口的nib文件,这听起来就像你正在做的那样。在这种方法中,您通常使用-initWithWindowNibName:初始值设定项。只要您传递正确的nib名称(通常不带文件名的“.nib”部分),并且可以在运行时正确找到该nib文件,并且该nib文件中的文件所有者被设置为自定义NSWindowController子类和这个子类的出口正确地连接到你的窗口,那么你应该全部设置。

可能要仔细检查以确保要加载的nib文件实际上位于应用程序包中。 (我偶尔忘记将它添加到目标中,因此在运行时无法找到nib文件,因此-initWithWindow:方法总是会显示一个零参数)。

+0

我认为问题在[自我控制器]内,因为我没有调用-initWithWindowNibName :.出于某种原因,我认为笔尖文件魔术般地将自己与控制器绑定在一起,但似乎并非如此。 (UnsubProgViewController *)控制器如果(!controller)controller = [[UnsubProgViewController alloc] init]; 回归控制器; }' 而......它就是这样!谢谢! – Aaron 2011-03-04 20:21:23