Задача C Делегат для главного окна приложения - PullRequest
1 голос
/ 11 августа 2009

Итак, я пытаюсь выполнить это упражнение, где мне нужно установить делегата для главного окна. Цель состоит в том, чтобы убедиться, что когда пользователь изменяет размер окна, оно всегда в два раза шире его высоты.

Это мой файл 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]; так как я установил делегата в Интерфейсном Разработчике, но я не уверен, почему это работает.

Как windowWillResize знает, что я имею в виду главное окно приложения, поскольку я делаю совершенно новый windowWillResize = [[NSWindow alloc] init];

У меня такое чувство, что я все делаю неправильно. Может ли кто-нибудь указать мне правильное направление? Спасибо!

Ответы [ 3 ]

3 голосов
/ 11 августа 2009

Действительно, вам не нужно создавать NSWindow *windowWilResize, поскольку у вновь созданного приложения Cocoa уже есть главное окно. Вам также не нужно реализовывать метод -init.

Вам нужно только установить appController в качестве делегата вашего главного окна в Интерфейсном Разработчике и реализовать метод -windowWillResize: в вашем appController.

Если вы знакомы с французским языком, вы можете взглянуть на запись в блоге, которую я написал на эту тему: Délégation en Cocoa .

2 голосов
/ 11 августа 2009

Вы пропускаете экземпляр NSWindow. В -init вы создаете NSWindow экземпляр. Однако это не используется, потому что при загрузке NIB он устанавливает все соединения, которые вы указали в Интерфейсном Разработчике, и вместо этого вы начинаете использовать окно из NIB. Не создавайте объект окна в коде - Interface Builder сделает это за вас! : -)

На самом деле, это не совсем «вместо»; контроллер вашего приложения теперь является делегатом для обоих NSWindow экземпляров - того, который поступает из NIB, и того, который вы создали в -init. Однако, поскольку код NSWindow никогда больше не используется, он все еще избыточен и должен быть удален.

1 голос
/ 03 сентября 2011

Если вы просто хотите сохранить соотношение сторон окна, вы можете использовать любой из этих двух NSWindow методов:

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

Первый метод блокирует весь размер окна, включая строку заголовка. Второй просто контент. Вы можете вызвать этот метод во время инициализации вашего окна внутри делегата (например: -applicationDidFinishLaunching)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...