主应用程序窗口的 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

将 Objective-C 委托方法与 swift 文件混合

Objective-C - 获取主窗口内容视图的所有子视图

在objective-c中在哪里设置窗口大小iOS?

Objective-C – 从应用程序委托向视图控制器发送消息