0

结构简单:

示例控制器.h

#import <Foundation/Foundation.h>

@interface exampleController : NSWindowController {

@public

IBOutlet NSPanel *entryPanel;

@property (nonatomic, strong) IBOutlet NSPanel *entryPanel;

@end

示例控制器.m

#import "exampleController.h"

@implementation exampleController

@synthesize entryPanel;

- (id)init {
    self = [super initWithWindowNibName:@"ExamplePanel"];
    if (self) {
        // Initialization code here.
        NSLog(@"entryPanel: %@", entryPanel);
        [self.entryPanel setTitle:@"TESTING!"];
    }

    return self;
}

随机控制器.m

...

- (id) init {

  self = [super init];
  if (self) {

    // loading our example controller if it isn't loaded yet.
    if (!ourExampleController) {
       ourExampleController = [exampleController alloc] init]; 
    }
  }

  return self;
}

...然后在一个方法中的随机控制器中,我通过以下方式显示 NSPanel:

[ourExampleController showWindow:self];
[ourExampleController window] makeKeyAndOrderFront:self];

我的问题是,无论如何,第一次 NSPanel 显示并显示自己时,标题始终仍设置为它在 Interface Builder 中的标题!即使我在exampleController init 方法中明确设置了标题。

我还尝试在 exampleController 的 init 方法中抛出NSLog(@"entryPanel: %@", entryPanel)并且在启动时它始终为 NULL。我不必在 init 中分配我所有的 IBOutlets,因为我已经在合成它们了?

我已经仔细检查了界面生成器中的所有内容。ExamplePanel.xib 的文件所有者设置为 exampleController 类。window 和 entryPanel 出口都引用了我们的 xib 文件中的 NSPanel。我错过了什么??

提前致谢!

编辑:只是添加。如果我打开窗口(..并看到默认的 IB 标题)然后关闭它并使用更改标题的方法重新打开它 - 它似乎有效!这个问题似乎只存在于第一次打开的窗口中。似乎在窗口第一次打开之前我的属性没有被分配?

4

2 回答 2

1

尤里卡!

根据此处的讨论: 从 NIB 加载后,IBOutlet 实例为(空)

我了解到,当我的控制器初始化时,窗口本身并没有加载。发现这令人惊讶,因为我认为使用initWithWindowNibName:@"myNibFile"也会分配和初始化所有出口属性,但因为我是 OSX Obj-C 的新手,情况似乎并非如此。只有在加载窗口本身后,才会分配所有出口属性。

只显示窗口很容易(如果它还没有加载,它也会加载窗口)然后快速将所有插座设置为我想要的值但这对我来说是个问题,因为我想避免这种轻微的“屏幕闪烁” (由于缺乏更好的描述)当值调整到它们的新设置时发生。

解决方案是找到一种方法来加载控制器并加载窗口而不首先实际显示它!然后我发现了这一点: 你能强制加载一个 NSWindow,即在它出现在屏幕上之前?

实现这一目标的步骤:

将以下内容添加到我的 NSWindowController 子类 init 方法中:

 // this loads the window as per link/description above
 [self window]

关键似乎是确保在您的 NIB/XIB 文件中未选中Visible At Launch。如果它被选中(默认行为),那么当您的应用启动时,上面的[self window]调用仍将显示您的窗口。取消选中上述选项可确保在您自己明确显示之前,上述调用不会显示您的窗口!

例如,您可以定义一个加载窗口的操作按钮:

[exampleController showWindow:self];
[[exampleController window] makeKeyAndOrderFront:self]; 

希望这可以帮助其他人。头疼了几个小时!

于 2014-08-13T19:06:18.573 回答
1
于 2014-08-14T07:11:56.820 回答