目标C代表主应用程序窗口

时间:2009-08-11 08:31:56

标签: objective-c delegates

所以我正在尝试这个练习,我需要为主窗口设置一个委托。目的是确保当用户调整窗口大小时,它总是宽度的两倍。

这是我的AppController.h文件:

#import <Cocoa/Cocoa.h>

@interface AppController : NSObject
{
    NSWindow *windowWillResize;
}

@end

这是我的AppController.m文件:

#import "AppController.h"

@implementation AppController

- (id) init
{
    [super init];
    windowWillResize = [[NSWindow alloc] init];
    [windowWillResize setDelegate:self];

    return self;
}

- (NSSize) windowWillResize:(NSWindow *)sender
                 toSize:(NSSize)frameSize;
{
    NSLog(@"size is changing");
    return frameSize;
}

@end

但是,我可以删除该行 [windowWillResize setDelegate:self]; 因为我在Interface Builder中设置了委托,但我不确定为什么会这样。

windowWillResize如何知道我指的是主应用程序窗口,因为我正在做一个全新的 windowWillResize = [[NSWindow alloc] init];

我有一种感觉,我完全做错了。有人能指出我正确的方向吗?谢谢!

3 个答案:

答案 0 :(得分:3)

实际上,您不需要创建NSWindow *windowWilResize,因为新创建的Cocoa应用程序已经有一个主窗口。您也不需要实现-init方法。

您只需要将appController设置为Interface Builder中主窗口的委托,并在appController中实现-windowWillResize:方法。

如果您熟悉法语,可以查看我就此主题撰写的博客文章:Délégation en Cocoa

答案 1 :(得分:2)

您正在泄漏NSWindow的实例。在-init中,您可以创建一个NSWindow实例。但是,没有使用它,因为当NIB加载时,它会设置您在Interface Builder中指定的所有连接,并开始使用NIB中的窗口。不要在代码中创建窗口对象 - Interface Builder为您完成! : - )

事实上,它并不是“相反”;您的app控制器现在是两个 NSWindow实例的委托 - 来自NIB的实例和您在-init中实例化的实例。但是,由于代码内NSWindow从未在其他任何地方使用过,因此它仍然是多余的,应该删除。

答案 2 :(得分:1)

如果您只想保持窗口的宽高比,可以使用以下两种NSWindow方法之一:

  • setAspectRatio:(NSSize)
  • setContentAspectRatio:(NSSize)

第一种方法锁定整个窗口大小,包括标题栏。第二个只是内容。您可以在委托内部窗口初始化期间调用此方法(例如:-applicationDidFinishLaunching