Связывание объектов NSWindowController в Интерфейсном Разработчике - PullRequest
2 голосов
/ 30 мая 2011

Я создал xib-файл NSWindow, который я хочу открыть нажатием кнопки в другом окне.

Теперь, чтобы контролировать поведение NSWindow, я перетащил объект из библиотеки в xib и изменил его.для подкласса NSWindowController (т.е. ListingWindowController), который я определил в XCode.

Точно так же я также создал подкласс NSViewController (то есть ListingViewController) для управления NSView внутри NSWindow.Чтобы сделать это, я перетащил NSViewController из библиотеки в xib и изменил его класс на ListingViewController.

@class ListingViewController;

@interface ListingWindowController : NSWindowController {
    IBOutlet ListingViewController *listingVC;
}

@property (nonatomic, retain) IBOutlet ListingViewController *listingVC;
@end

Я подключил окно и распечатал VC моего оконного контроллера в IB.

Теперь, чтобы вызвать это окнопо нажатию кнопки в моем (первом) окне запуска я создаю оконный контроллер, используя initWithWindowNibName, как это ..

- (IBAction) pushConnect:(id)sender {
    NSLog(@"Connect pushed.");
    if (wc == nil) {
        wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow" owner:self];
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(closeWindow:) name:NSWindowWillCloseNotification object:nil];

        [wc showWindow:sender];
    }
}

Проблема заключается в том, что, несмотря на все привязки, сделанные в IB для представленияконтроллеры предстоящего окна / вида, окно и листинг VC оказываются (ноль), (ноль) даже после загрузки нового окна (код ниже).

- (void)windowDidLoad {
    [super windowDidLoad];

NSLog(@"windowDidLoad = %@, %@", self.window, self.listingVC);
}

Пожалуйста, помогите, почемусоединения не работают.Я уже довольно долго бьюсь над этой проблемой.

PS: Я работаю в iOS.Итак, я предполагаю, что контроллер окна / представления Mac ведет себя подобно iOS UIViewControllers.

TIA ..

1 Ответ

11 голосов
/ 30 мая 2011

Обратите внимание:

wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow" owner:self];

означает, что self (неясно, что self из вашего вопроса) является владельцем ListingWindow.nib. Это означает, что self - это тот, кто хранит объекты для объектов в этом файле пера, а self отвечает за освобождение объектов верхнего уровня в файле пера. Это также означает, что вы создаете экземпляр ListingWindowController в своем коде и другой экземпляр в своем файле пера, поскольку вы перетаскивали объект класса ListingWindowController в файл пера.

Это не так, как должно быть.

В подавляющем большинстве случаев контроллер окна (представления) загружает файл пера и становится его владельцем. Он имеет выход window (view), который должен быть связан с окном верхнего уровня (представление) в файле пера. Являясь владельцем файла пера, он должен быть создан до загрузки файла пера.

Чтобы добиться этого для вашего оконного контроллера, вам нужно установить класс владельца файла на ListingWindowController. Вы не должны перетаскивать объектный куб и создавать экземпляр контроллера окна внутри файла пера. Контроллер окна является владельцем файла пера, поэтому он должен существовать до загрузки файла пера. Вы также должны связать выход window в владельце файла с объектом окна верхнего уровня в файле пера, чтобы оконный контроллер знал, каким окном он должен управлять.

Сделав это, используйте:

wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow"];

вместо:

wc = [[ListingWindowController alloc] initWithWindowNibName:@"ListingWindow" owner:self];

, поскольку wc должен быть владельцем nib-файла.

Контроллеры вида работают аналогично. Они создаются перед загрузкой nib-файла, отвечают за загрузку nib-файла, который содержит представление в качестве объекта верхнего уровня, являются владельцем этого nib-файла и имеют выход view, который должен быть связан с этим верхним уровнем. вид.

Из вашего вопроса не ясно, есть ли у вас отдельный файл пера для просмотра. Если вы этого не сделаете, то использование подкласса NSViewController вообще не нужно - вместо этого вы можете использовать подкласс NSObject. Если вы настаиваете на использовании NSViewController для управления представлением, которое не загружено из отдельного файла пера, вам следует переопределить -loadView, чтобы получить ссылку на представление другими способами, кроме загрузки его из файла пера, и отправив -setView:, чтобы он знал о представлении, которым он должен управлять.

Рекомендуемое чтение: Nib-файлы в Руководстве по программированию ресурсов , Ссылка на класс NSWindowController , Ссылка на класс NSViewController .

...