NSViewController & Interface Builder - PullRequest
3 голосов
/ 24 декабря 2011

У меня есть простой проект, который состоит из простого окна с одним представлением, полученным из NSViewController (см. http://i.stack.imgur.com/UAn6L.png)

enter image description here

Представление управляется (+ связано, см. Скриншот) с моим пользовательским объектом контроллера представления.

Я перетащил объект ViewController в свой файл MainMenu.xib, подключил точку просмотра и установил Controller-Class + Nib-Name.

Когда я запускаю приложение, мое собственное представление не будет отображаться в окне (в моем пользовательском подклассе NSViewController вызывается «awakeFromNib»!).

См. Снимок экрана для деталей IB -> http://i.stack.imgur.com/UAn6L.png

Есть идеи, что мне не хватает?

Ответы [ 2 ]

3 голосов
/ 24 декабря 2011

Я предполагаю, что у вас есть отдельный Nib с именем CustomImageView, который не отображается (тот, который автоматически создается XCode). В этом случае вы добавили бы свои элементы управления и чертежный код к представлению в этом отдельном Nib. Чтобы фактически добавить это представление контроллера представления к окну, вам нужно сделать это программно, установив соединение IBOutlet из AppDelegate с контроллером представления и добавив следующий код, когда вы хотите добавить представление: (обычно в applicationDidFinishLaunching:)

[viewController.view setAutoresizingMask:(NSViewWidthSizable|NSViewHeightSizable)];
[viewController.view setFrame:NSInsetRect([window.contentView bounds], 20, 20)];
[window.contentView addSubview:viewController.view];

Это поместит его вставку и по центру, как у вас на скриншоте. Проблема заключается в том, что, создавая соединение view в вашем Nib MainMenu, вы переопределяете соединение в отдельном * Nib * *. Вы можете удалить объект пользовательского вида в своем окне ... вам придется добавить свой пользовательский вид программным способом. Было бы хорошо, если бы это работало таким образом, но это не так.

EDIT:

Это из-за того, что перья разархивированы. Сначала создается экземпляр CustomImageView, и все его соединения устанавливаются. На этом этапе свойство view установлено правильно. Затем MainMenu снова подключает свойство view, переопределяя свойство view в отдельном Nib. Теперь свойство view установлено неправильно. Это нормальное поведение. Если вы используете отдельный кончик, вы должны оставить его не подключенным и добавить представление контроллера представления в коде.

Альтернативой может быть не использовать отдельный Nib. Просто удалите его из своего проекта, настройте вид в окне и оставьте соединение как есть. Теперь вы можете иметь отдельный контроллер представления, управляющий им, без добавления какого-либо кода. Вам действительно нужен отдельный Nib, только если представление очень сложное или если вы хотите загружать его лениво по мере необходимости, например, если пользователь может выбрать разные представления для главного окна.

1 голос
/ 24 декабря 2011

Я удалил свой предыдущий ответ, потому что я думал, что вы разрабатываете для устройств iOS. Теперь я понимаю, что это стандартный проект Mac OS. Но в любом случае, то, что я сказал о настройке начального viewcontroller, остается прежним. Хорошо, у вас есть собственный объект NSViewController, который имеет объект NSView. Это довольно хорошо, пока здесь. Но как приложение должно знать, какое представление показывать при запуске. Вы должны либо сделать начальный просмотр представления NSViewController, либо начальный viewcontroller непосредственно объектом NSViewController, чтобы он знал, что показывать при запуске. Я хотел бы видеть ваш проект, если он такой простой. Просто отправьте его на мою электронную почту. *

...