NSArrayController / NSTreeController и представления какао - PullRequest
3 голосов
/ 25 августа 2009

Я некоторое время читал немного о Objective C и Cocoa, и я должен сказать, что, хотя я в восторге от общей простоты Objective-C, я чувствую себя полностью потерянным в отношении Какао и особенно дизайна MVC шаблон. Книги по какао, которые я прочитал, просят читателя просто выполнить ряд шагов для работы программы, не объясняя механизмы API. Я пытаюсь понять общее значение NSTableView, NSOutlineView, их источников данных, их делегатов и что все это имеет отношение к различным классам контроллеров, таким как NSArrayController и NSTreeController. Поэтому у меня есть пара вопросов:

  • Как эти классы действительно взаимодействуют?
  • Является ли источник данных NSTableView экземпляром NSArrayController?
  • Должен ли делегат и источник данных быть одним и тем же классом в NSTableView или NSOutlineView?
  • Оставляя привязку в стороне, есть ли у NSArrayController и NSTreeController какие-либо другие важные преимущества?

Давайте предположим, что существует контейнер (в C) с какими-то данными (структура C). Мы хотим иметь возможность отображать эти данные в NSTableView (или NSOutlineView) и обмениваться представлениями во время выполнения, если структура данных является иерархической. Должен ли я создать класс, который имеет NSArrayController (или NSTreeController) в качестве экземпляра, и обернуть функциональность контейнера C?

Спасибо и прости меня за мои глупые вопросы.

Ответы [ 3 ]

3 голосов
/ 25 августа 2009

Это не глупые вопросы. Вы задаете точно правильные вопросы, и вы пошли к сути того, как выучить какао. Сначала изучите MVC и узнайте, как его применяет Cocoa, а остальное будет понятно.

Медленно устаревая книга по изучению какао все же не может быть лучше, чем Программирование какао для Mac OS X Аарона Хиллегаса. Я написал еще несколько комментариев об этой книге в прошлом году , если вам интересно. И еще несколько руководств (в основном для новых разработчиков iPhone) здесь и здесь .

К вашему конкретному вопросу, вместо того, чтобы хранить данные в структуре C, сохраните их в объекте Objective-C (объект модели, «M» в MVC).

Затем создайте класс Controller, который будет источником данных для NSOutlineView (который предназначен для иерархических данных). На данный момент избегайте классов Какао, которые заканчиваются на «Контроллер». Они связаны с привязками (и в основном используются для базовых данных). Несмотря на то, что они очень мощные, они больше, чем вы хотите погрузиться в начале (и даже после многих лет программирования Какао, я использую привязки только для определенных целевых задач; они могут усложнить поддержку ваших программ, если они сложные) , Ваш контроллер на данный момент должен быть подклассом NSObject. Он будет реализовывать методы NSOutlineViewDataSource. Если вам нужен делегат, обычно и естественно сделать один и тот же объект источником данных и делегатом.

1 голос
/ 25 августа 2009

Как эти классы действительно взаимодействуют?

Рассмотрим традиционный способ использования TableView или OutlineView (на любом языке). Обычно вы реализуете интерфейс источника данных, который будет предоставлять данные для представления. Эта реализация источника данных по сути является «контроллером», который переводит вашу модель данных в табличное представление; и он также может обрабатывать выбор строки, вставку, удаление, сортировку, фильтрацию и т. д.

Теперь предположим, что в вашем приложении есть несколько различных TableView, каждый со своей реализацией источника данных. Вы обнаружите, что каждая реализация источника данных начинает выглядеть одинаково; вы сможете повторно использовать большой объем кода между вашими источниками данных, поскольку при условии, что они работают с одинаковыми или похожими моделями данных, код для сортировки и т. д. также одинаков.

Вот что такое NSArrayController: универсальный контроллер TableView / источник данных. Он обрабатывает выбор строк, вставку, удаление, сортировку, фильтрацию и т. Д., Тем самым избавляя вас от необходимости писать кучу шаблонного кода.

Является ли источник данных NSTableView экземпляром NSArrayController?

Нет, привязки данных заменяют традиционный интерфейс источника данных; поэтому NSTableView подключается к контроллеру массива с помощью привязок данных.

Например, вы бы связали столбец табличного представления со свойством вашей модели:

myArrayController.arrangedObjects.firstName 

где arrangedObjects - это свойство NSArrayController, а firstName - это свойство вашей модели.

Должен ли делегат и источник данных быть одним и тем же классом в NSTableView или NSOutlineView?

При использовании привязок данных вы не устанавливаете источник данных NSTableView. Вы по-прежнему можете предоставить делегат NSTableView для настройки внешнего вида и поведения представления. NSArrayController не является делегатом NSTableView.

Если привязки данных не используются, вы должны реализовать источник данных. Часто источник данных и делегат - это один и тот же объект.

0 голосов
/ 25 августа 2009

Делегат - это объект, который получает обратные вызовы, когда с представлением происходит что-то интересное.

Источник данных очень похож на делегат - он также получает обратные вызовы, но только те, которые связаны с получением данных для таблицы.

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...