Nib的IBOutlets没有连接(零)

时间:2011-09-27 11:20:18

标签: xcode macos cocoa user-interface

我有一个Custom类,它应该从nib文件加载一个窗口。 当我加载nib文件时,一切看起来都很好,除了IBOutlets没有连接,即nil。 IBActions工作正常,当他们被称为IBOutlets不再是零。

该类被添加到IB中的nib作为对象,显然所有内容都已连线。

这是文件的所有者和代理

当它加载笔尖时,只有在设置“启动时可见”时才会出现窗口。

我在哪里加载笔尖并尝试立即或几秒钟后访问IBOutlets并不重要。

一定是非常微不足道的......

更新2:我上传了一个更简单的试验项目:Trial Project2

预期行为:加载时,Window2标题更改为“标题已更改x次”。它只在按下按钮后才开始工作,即IBOutlets不再为零。

2 个答案:

答案 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中。