Указатель на NSWindow Xib после загрузки его?

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

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

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

Что я делаю неправильно здесь?

5
задан Brock Woolf 13 March 2010 в 15:18
поделиться

4 ответа

Вы должны использовать подкласс 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

В Interface Builder установите для класса File's Owner класс MyWindowController и подключите окно выход Владелец файла к объекту окна в перо.

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

MyWindowController* controller = [[MyWindowController alloc] init];
[controller showWindow:self];
16
ответ дан 18 December 2019 в 08:27
поделиться

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

1
ответ дан 18 December 2019 в 08:27
поделиться

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

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

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

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

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

0
ответ дан 18 December 2019 в 08:27
поделиться

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

 CustomWindow * window = [[CustomWindow alloc] init]; 
if (! [NSBundle loadNibNamed: @ "NibName" owner: window]) 
 [центр окна]; // не работает 
 

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

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

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

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

2
ответ дан 18 December 2019 в 08:27
поделиться