Указатель на NSWindow Xib после его загрузки? - PullRequest
5 голосов
/ 11 марта 2010

В моем коде ниже CustomWindow является подклассом NSWindow.

CustomWindow *window = [[CustomWindow alloc] init];
if (![NSBundle loadNibNamed:@"NibName" owner:window])
[window center]; // doesn't work

Как вы получаете указатель для управления вашим XIB после загрузки, чтобы вы могли выполнять такие действия, как центрирование NSWindow (я имею в виду сериализованное, которое находится внутри XIB)?

Что я здесь не так делаю?

Ответы [ 4 ]

16 голосов
/ 12 марта 2010

Вы должны использовать подкласс NSWindowController. NSWindowController специально разработан для выполнения именно того, чего вы хотите достичь, и решает несколько проблем, с которыми вы столкнетесь, если загрузите перо напрямую, используя методы NSBundle. Как правило, вы всегда должны использовать подкласс NSWindowController для управления окнами.

Создать подкласс NSWindowController:

@interface MyWindowController : NSWindowController {}
@end

@implementation MyWindowController
- (id)init
{
    self = [super initWithWindowNibName:@"MyWindow"];
    if(self)
    {
        //initialize stuff
    }
    return self;
}
//this is a simple override of -showWindow: to ensure the window is always centered
-(IBAction)showWindow:(id)sender
{
    [super showWindow:sender];
    [[self window] center];
}
@end

В Интерфейсном Разработчике установите класс Владелец файла равным MyWindowController и подключите window выход Владелец файла к объекту окна в вашем кончике.

Затем вы можете отобразить окно, выполнив следующее:

MyWindowController* controller = [[MyWindowController alloc] init];
[controller showWindow:self];
2 голосов
/ 13 марта 2010

В моем коде ниже CustomWindow является подклассом NSWindow.

CustomWindow *window = [[CustomWindow alloc] init];
if (![NSBundle loadNibNamed:@"NibName" owner:window])
[window center]; // doesn't work

Как вы получаете указатель для управления вашим XIB после загрузки, чтобы вы могли делать такие вещи, как центрирование NSWindow внутри XIB?

«центрирование NSWindow внутри XIB» не имеет смысла (вы бы центрировали его на экране ), если только вы не имеете в виду центрирование объекта NSWindow, который находится внутри XIB, в этом случае, почему создание другого объекта NSWindow (CustomWindow) вне xib?

Помните, что nib (или xib) - это архив объектов. Если вы хотите использовать окно, которое у вас есть в перо, вам нужно создать выход, указывающий на это окно, установить класс владельца файла равным классу, в который вы добавили выход, подключите выход в IB, и назначьте объект с выходом владельцем файла, передав его аргументу owner:. Этот объект, как владелец, будет отвечать за работу с окном. Это может быть (обычно в моем коде) тот же объект, который загружает перо.

Кроме того, init не работает в NSWindow; Вы должны использовать initWithContentRect:styleMask:backing:defer: или initWithContentRect:styleMask:backing:defer:screen:. Использование init будет допустимо только в том случае, если вы самостоятельно внедрили init в CustomWindow и использовали один из этих двух селекторов для сообщения [super init…].

1 голос
/ 11 марта 2010

Вы, вероятно, не хотите, чтобы ваше окно было владельцем файла. Обычно вы передаете туда self или некоторый объект контроллера. Затем, если self или этот объект контроллера имеет CustomWindow IBOutlet, он будет подключен при вызове loadNibNamed:. Проверьте этот пост , например, код.

0 голосов
/ 12 марта 2010

XIB - это контейнер для объектов, он не равен окну. Вы не можете центрировать XIB, вы можете центрировать только окно, содержащееся в XIB.

Кроме того, объекты в XIB создаются при загрузке. Вы не передаете объект как владельца, который затем заменяет один из объектов в XIB, вы вместо этого используете IBOutlets для получения ссылок на новые объекты, созданные при загрузке XIB, и затем вы можете взаимодействовать с ними.

Объект «Владелец файла» - это специальный объект в XIB, поскольку это единственный объект, который не был создан и который можно указать, передав его в loadNibNamed:owner:. Это ваш шлюз между объектами, созданными в XIB, и вашим приложением.

Обычно объект владельца - это некий класс контроллера. Установите класс владельца файла в Interface Builder на свой класс контроллера, затем определите некоторые IBOutlets в классе, они будут отображаться в Interface Builder на владельце файла, и вы можете подключать к ним ваши объекты в XIB.

Наконец, когда вы передаете объект контроллера на loadNibNamed:owner:, Cocoa подключит ваши IBOutlets к вновь созданным объектам, и вы сможете использовать их для взаимодействия с ними, например, центрировать окно в вашей XIB.

...