我有一个Custom类,它应该从nib文件加载一个窗口。 当我加载nib文件时,一切看起来都很好,除了IBOutlets没有连接,即nil。 IBActions工作正常,当他们被称为IBOutlets不再是零。
该类被添加到IB中的nib作为对象,显然所有内容都已连线。
这是文件的所有者和代理
当它加载笔尖时,只有在设置“启动时可见”时才会出现窗口。
我在哪里加载笔尖并尝试立即或几秒钟后访问IBOutlets并不重要。
一定是非常微不足道的......
更新2:我上传了一个更简单的试验项目:Trial Project2
预期行为:加载时,Window2标题更改为“标题已更改x次”。它只在按下按钮后才开始工作,即IBOutlets不再为零。
答案 0 :(得分:2)
最大的变化是继承NSWindowController以创建MyClass。这样,您只在窗口加载后尝试操作关闭按钮。您的代码足够小,我认为最好只发布更改:
trialProjectAppDelegate.m
#import "trialProjectAppDelegate.h"
@implementation trialProjectAppDelegate
@synthesize window;
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
myclass = [[MyClass alloc] init];
// Note that I'm forcing the window to load here.
(void) [myclass window];
}
@end
MyClass.h
#import <Cocoa/Cocoa.h>
@interface MyClass : NSWindowController
{
IBOutlet NSButton *dismissButton;
}
- (IBAction)closeNaggingWindow:(id)sender;
- (void)disableDismissButton;
@end
MyClass.m
#import "MyClass.h"
@implementation MyClass
- (id)init
{
if ((self = [super initWithWindowNibName:@"Window"]) != nil)
{
}
return self;
}
- (void)disableDismissButton
{
[dismissButton setEnabled:NO];
[dismissButton setTitle:@"Closing enabled in 5 sec"];
[self performSelector:@selector(enableDismissButton:) withObject:nil afterDelay:5];
}
- (IBAction)enableDismissButton:(id)sender
{
[dismissButton setEnabled:YES];
[dismissButton setTitle:@"Close"];
}
- (IBAction)closeNaggingWindow:(id)sender
{
[[self window] close];
[self autorelease];
}
- (void)awakeFromNib
{
[self disableDismissButton];
}
@end
最后,在Window.xib文件中,丢弃naggingWindow插座并将窗口连接到NSWindowController提供的窗口。
答案 1 :(得分:1)
我没有使用任何OS X接口类,所以可能有一些方面不是100%精确准确,但基本上发生的是这样:
您已将笔尖的NSWindow
对象连接到MyClass
对象,该对象也在您的笔尖中。所以当你加载那个笔尖时,这就是正在发生的事情:
MyClass
个实例NSWindow
个实例,其中包含多个子视图。 NSWindow
和按钮已附加到新的MyClass
实例。MyClass
实例)然后在您的原始-changeWindowTitle
实例上调用MyClass
,该实例没有连接任何插座。
解决方案很简单:从nib文件中删除MyClass对象。选择“文件所有者”,然后在Identity Inspector(“实用程序”窗格中左侧的第三个图标)中将“Class”设置为“MyClass”。现在将您的出口重新连接到File的Owner对象,这是您原来的MyClass
实例。您现在应该看到您期望的行为。
顺便说一下,“在加载笔尖后立即执行操作”,就像在新鲜的IBOutlet对象上设置属性一样,在方法-windowDidLoad
中。