gpt4 book ai didi

objective-c - NSPanel - 为什么在显示窗口之前无法设置面板标题和数据值?

转载 作者:行者123 更新时间:2023-12-03 17:39:06 26 4
gpt4 key购买 nike

结构简单:

exampleController.h:

#import <Foundation/Foundation.h>

@interface exampleController : NSWindowController {

@public

IBOutlet NSPanel *entryPanel;

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

@end

exampleController.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;
}

randomController.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;
}

...然后在随机 Controller 中的方法中,我通过以下方式显示 NSPanel:

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

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

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

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

提前致谢!

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

最佳答案

Eureka !

根据此处的讨论: IBOutlet instances are (null) after loading from NIB

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

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

解决方案是找到一种方法来加载 Controller 并加载窗口,而无需先实际显示它!然后我发现了这一点: Can you force a NSWindow to load, i.e. before it is presented onscreen?

实现这一目标的步骤:

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

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

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

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

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

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

关于objective-c - NSPanel - 为什么在显示窗口之前无法设置面板标题和数据值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25291627/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com