【问题标题】:Objective C Delegate for the Main Application Window主应用程序窗口的 Objective C 委托
【发布时间】: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];

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

【问题讨论】:

    标签: objective-c delegates


    【解决方案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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2015-09-27
        • 2010-10-01
        • 1970-01-01
        • 1970-01-01
        • 2016-11-10
        • 2011-04-12
        相关资源
        最近更新 更多