Обратите внимание:
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 .