Обзор высокого уровня NSView?

Я пытаюсь создать собственное представление и загрузить его в окно.

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

И я имею в виду настоящие мельчайшие детали того, где объявить и инициализировать, что нужно импортировать, все. Потому что я просматриваю каждую книгу, которая у меня есть, и она просто не ясна моему тщедушному мозгу.

Спасибо!


person Alec Sloman    schedule 16.10.2010    source источник


Ответы (1)


как создать объект представления, контроллер представления, связанный .xib, а затем загрузить его в окно…

Это несколько вещей, и некоторые из них противоречат друг другу.

Если вы создаете представление в коде, вам не нужно (и не следует) также создавать его в nib, и наоборот.

Если вы создаете контроллер представления для загрузки пера, вы будете создавать представление в пера, поэтому вам определенно не следует создавать такое же представление в коде.

Вам не нужно создавать контроллер представления для большинства представлений. Чаще всего каждому контроллеру принадлежит ровно одно окно. Единственный раз, когда вам нужны контроллеры представления, — это когда вы управляете сложной иерархией представлений в одном окне (скорее всего, если вы делаете свое приложение однооконным).

… (после очистки текущего вида).

В Cocoa нет «текущего представления». У вас может быть несколько окон, и каждое из них имеет глубокую иерархию представлений, которую вы обычно не редактируете во время выполнения. Замена одного вида на другой за пределами какого-либо пользовательского интерфейса с вкладками очень необычна.

Создание объекта представления в коде

Отправьте требуемому классу представления сообщение alloc, а возвращенному представлению сообщение initWithFrame: (если иное не указано в документации класса). Вам, конечно, потребуется освободить или автоматически освободить это представление.

Создание объекта представления в кончике

Предоставление ему собственного пера (особенно для контроллеров представления)

Используйте шаблон view-nib в IB (новый) или Xcode (добавить файл). Если вы создаете его в Xcode, не забудьте получить информацию о нем и сделать его локализуемым. Если вы создаете его в IB, вы должны сохранить его в одну из ваших папок .lproj; тогда он уже будет локализуемым.

Перо, созданное из этих шаблонов, будет содержать один пустой NSView. Вы можете изменить его класс и/или добавить подпредставления, как описано ниже.

Делаем это в существующем наконечнике

Перетащите «Пользовательский вид» из палитры «Библиотека» в окно пера, затем установите класс вида в инспекторе ⌘6.

Вы делаете это только для представления верхнего уровня в наконечнике. О его подвидах см. ниже.

Помещение представления в иерархию представлений окна

Если представление должно быть корнем иерархии представлений окна (представление содержимого окна)

Установите вид содержимого окна.

В IB вы не можете изменить вид содержимого окна. Вместо этого вы что-то меняете в нем — его класс, подпредставления и т. д. Нет причин пытаться заменить представление содержимого окна другим представлением в IB.

Если представление должно быть подвидом существующего представления

Способ сделать это в коде — отправить супервизору сообщение addSubview:.

Если оба представления находятся в одном и том же наконечнике, создайте подпредставление и добавьте его в суперпредставление в том же действии. Перетащите «Пользовательский вид» из библиотеки в суперпредставление, а не в окно пера, затем установите класс подпредставления в инспекторе ⌘6.

(Если вы настраиваете одно из стандартных представлений Apple, а не создаете полностью оригинальное пользовательское представление, перетащите стандартное представление Apple, на основе которого вы создали свое, из библиотеки, а затем измените его класс на свой настроенный подкласс.)

person Peter Hosey    schedule 16.10.2010
comment
Еще раз спасибо, Питер. Я хочу последовать примеру наличия настраиваемого представления в корне окна, а затем добавлять к нему подпредставления при возникновении определенных событий, поэтому, если я правильно понимаю, это включает в себя перетаскивание настраиваемого представления в NSWindow, а затем наличие 2 настраиваемых представления как собственные объекты. Но чувак... Я не собираюсь устанавливать какие-либо из этих классов представлений. Только в ИБ? Или у них должны быть соответствующие файлы классов представления? И если да, то что должны содержать эти файлы классов? Ничего? Кстати, я принимаю этот ответ, потому что, опираясь на историю, я уверен, что могу ему доверять! - person Alec Sloman; 17.10.2010
comment
Вы не можете просто придумать имя класса в IB и заставить класс существовать; вы должны реализовать класс в исходном коде вашей программы. В Xcode есть шаблон для подкласса NSView: это один из вариантов суперкласса, когда вы добавляете + создаете файлы для нового класса Objective-C. Вы можете оставить его пустым, но тогда он не будет на самом деле настраиваемым, и вы можете не беспокоиться о создании собственного класса — просто оставьте экземпляр любого стандартного класса представления Apple, с которого вы начали. Когда вы создаете собственный класс представления, вы всегда будете настраивать что-то. - person Peter Hosey; 17.10.2010