主应用程序窗口的 Objective C 委托
Posted
技术标签:
【中文标题】主应用程序窗口的 Objective C 委托【英文标题】:Objective C Delegate for the Main Application Window 【发布时间】:2009-08-11 08:31:55 【问题描述】:所以我正在尝试做这个练习,我需要为主窗口设置一个委托。目的是确保当用户调整窗口大小时,窗口的宽度始终是高度的两倍。
这是我的 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];
我有一种感觉,我完全做错了。有人能指出我正确的方向吗?谢谢!
【问题讨论】:
【参考方案1】:确实,您不需要创建NSWindow *windowWilResize
,因为新创建的 Cocoa 应用程序已经有一个主窗口。您也不需要实现-init
方法。
您只需在 Interface Builder 中将 appController 设置为主窗口的委托,并在 appController 中实现 -windowWillResize:
方法。
如果你熟悉法语,你可以看看我写的关于这个主题的博客文章:Délégation en Cocoa。
【讨论】:
感谢 Graham 和 mouviciel。我怀疑我创建的 NSWindow 不正确。我不知道的是 windowWillResize 是一个内置函数。所以这是我的下一个问题,如果我没有使用界面生成器,我的代码中是否有指定我希望 appController 成为 MainWindow 的委托? 哦等等,现在我很困惑... windowWillResize 怎么知道控制主窗口?我在头文件中声明了它,但我没有将它连接到主窗口。我只将appController设置为delegate... windowWillResize函数如何链接到实际调整大小? 在 Interface Builder 中将 appController 设置为委托是将 -windowWillResize 连接到主窗口的方法。每当用户请求调整主窗口的大小时,窗口实例都会发送一条消息 [delegate windowWillResize:...] where delegate = appController.【参考方案2】:您正在泄漏NSWindow
的实例。在-init
中,您创建一个NSWindow
实例。但是,它没有被使用,因为当 NIB 加载时,它会设置您在 Interface Builder 中指定的所有连接,并且您开始使用 NIB 中的窗口。不要在代码中创建窗口对象 - Interface Builder 会为您完成! :-)
事实上,它并不完全是“相反”;您的应用控制器现在是 both NSWindow
实例的委托 - 来自 NIB 的一个和您在 -init
中实例化的一个。然而,由于代码内的 NSWindow
从未在其他任何地方使用过,它仍然是多余的,应该删除。
【讨论】:
【参考方案3】:如果你只想保持窗口的纵横比,你可以使用NSWindow
这两种方法之一:
setAspectRatio:(NSSize)
setContentAspectRatio:(NSSize)
第一种方法锁定整个窗口大小,包括标题栏。第二个只是内容。您可以在委托内初始化窗口期间调用此方法(例如:-applicationDidFinishLaunching
)
【讨论】:
以上是关于主应用程序窗口的 Objective C 委托的主要内容,如果未能解决你的问题,请参考以下文章
如何在应用程序委托iOS10 Objective C中的applicationWillEnterForeground方法中以模态方式呈现UIViewController