2009-08-11 36 views
1

所以我试图做这个练习,我需要为主窗口设置一个委托。目的是确保当用户调整窗口大小时,它总是宽度的两倍。目标C代表主要应用程序窗口

这是我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:自我]。 因为我在Interface Builder中设置了委托,但我不确定这是为什么会起作用。如果windowWillResize知道我指的是主应用程序窗口,因为我正在执行一个全新的窗口,那么windowWillResize = [[NSWindow alloc] init];

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

回答

3

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

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

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

+0

谢谢格雷厄姆和mouviciel。 我怀疑我的NSWindow创建不正确。 我不知道的是windowWillResize是一个内置函数。 所以这里是我的下一个问题,如果我没有使用接口构建器,是否有我的代码中指定我想appController是MainWindow的委托? – hahuang65 2009-08-11 08:54:19

+0

哦,等等,现在我很困惑... windowWillResize如何知道控制主窗口?我在头文件中声明了它,但是没有将它连接到主窗口。我只将appController设置为委托... windowWillResize函数如何链接到实际调整大小? – hahuang65 2009-08-11 09:08:10

+0

在Interface Builder中将appController设置为委托是将-windowWillResize连接到主窗口的方式。每当用户请求调整主窗口的大小时,窗口实例将发送一个消息[delegate windowWillResize:...],其中delegate = appController。 – mouviciel 2009-08-11 09:26:52

2

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

事实上,它并不完全是“相反”。您的应用控制器现在是的代表NSWindow实例 - 来自NIB的实例和您在-init中实例化的实例。然而,由于代码NSWindow从来没有在其他地方使用过,它仍然是多余的,应该删除。

1

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

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

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

相关问题