Вопрос

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

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

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

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

Это было полезно?

Решение

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

Создать подкласс 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];

Другие советы

В моем коде ниже, 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…] сообщение.

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top