Главная » iPhone » Таблицы предпочтений iPhone

0

Таблицы предпочтений (preferences tables) предоставляют эстетически богатый интерфейс для отображения изменения программных настроек. Эти таблицы можно увидеть в iPhone-приложении Settings, но большинство приложений сторонних фирм предоставляют собственный интерфейс настроек, чтобы не допустить внесения изменений во встроенное окружение. Таблицы предпочтений предоставляют ячейки меняющегося размера, способные вмещать элементы управления, текстовые поля и информационный текст. Они также предоставляют механизм для логического объединения схожих предпочтений.

Создание таблицы предпочтений

При реализации класса UIPreferencesTable необходимо быть достаточно предусмотрительным, поскольку для запроса информации, необходимой для заполнения таблицы, используется ориентированная на обратный вызов привязка данных (data binding). Это делается аналогично объектам UITable, изученным вами в главе 3, но на более высоком уровне сложности. Исполняющий класс вызывает в источнике данных целый ряд методов для возвращения информации о таблице предпочтений: количество и размер каждой ячейки, объекты внутри ячеек, а также информацию о логических группировках.

Рис. 7.1. Аналогия диалога между таблицей предпочтений и ее источником данных

К большому разочарованию сообщества открытого кода iPhone все это существенно отличается от объектно-ориентированной модели, в которой каждая ячейка имеет собственные свойства и просто добавляется в качестве объекта. Вместо этого создание всей таблицы предпочтений — достаточно трудоемкое и сложное занятие в противовес традиционно элегантному стилю проектирования.

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

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

Поскольку таблица предпочтений состоит из двух частей (сама таблица и данные в ней), то самый правильный способ собрать все вместе — это создать подкласс uiPreferencesTable и заставить его выступать в роли собственного источника данных. Это позволит вашему приложению просто создавать экземпляр данного класса и отображать его на экране.

Наследование таблицы предпочтений

Чтобы создать автономную таблицу предпочтений, создайте подкласс uiPreferencesTable и включите все методы, необходимые для привязки к ней самой как к источнику данных. В приведенном далее примере создается подкласс MyPreferencesTable:

©interface MyPreferencesTable : UiPreferencesTable {

}

/* Методы таблицы предпочтений */

-   (id)initWithFrame:(CGRect)rect;

-   (void)dealloc;

/* Методы источника данных */

-   (int)numberOfGroupsInPreferencesTable:(UiPreferencesTable *)aTable;

-   (UIPreferencesTableCell *)preferencesTable: (UIPreferencesTable *)aTable cellForGroup:(int)group;

-   (float)preferencesTable:(UIPreferencesTable *)aTable heightForRow:(int)row

inGroup:(int)group withProposedHeight:(float)proposed;

-   (BOOL)preferencesTable:(UIPreferencesTable *)aTable isLabelGroup:(int)group;

-   (UIPreferencesTableCell *)preferencesTable: (UIPreferencesTable *)aTable cellForRow:(int)row

inGroup:(int)group;

Для работы с источником данных используются следующие методы:

?   numberOfGroupsinPreferencesTable— возвращает количество логических групп в таблице. Эти группы включают также группы текстовых меток, используемые для добавления к ячейке небольшого выпуклого текста. Метки групп не должны включаться в групповой подсчет;

?   cellForGroup— возвращает объект UIPreferencesTableCell, чтобы он выступил в роли заголовка группы для заданной группы. Эти ячейки создаются как объекты UIPreferencesTableCell, И С ПОМОЩЬЮ метода setTitle им присваивается заголовок группы;

?   heightForRow— возвращает высоту заданной строки. Данный метод снабжается предварительно заданной высотой, которая может быть возвращена как высота по умолчанию. Разумеется, высота любой ячейки определяется разработчиком, вы можете вернуть как предзаданную высоту, так и заданную вами, в зависимости от типа создаваемого объекта. Данный метод также вызывается для группы заголовков, используя при этом в качестве номер строки -1;

?   isLabelGroup— возвращает значение типа Boolean, указывающее на то, нужно ли ячейки в заданной группе рассматривать как текстовые метки. Текстовые метки меньше, чем метки групп, и используются для предоставления информационного текста. Если возвращается yes, то группа будет отображаться в виде небольшого выпуклого текста, а не в виде белой ячейки;

?   ceilFowRow— возвращает объект ячейки предпочтения для любой указанной строки или группы. Каждый раз, когда предпочтение попадает в

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

Кэширование ячеек предпочтений

Каждая ячейка в таблице предпочтений "забывается" таблицей после того, как она прокручивается с экрана. Когда она вновь прокручивается и попадает на экран, для данной строки снова вызывается метод cellFowRow. Это может послужить источником определенных проблем, если вы создаете новую строку каждый раз при вызове метода, а также может существенно замедлить прокрутку.

Иначе говоря, метод cellFowRow должен быть написан так, чтобы повторяющиеся запросы на одну и ту же ячейку предпочтений возвращали бы указатель на существующую ячейку, а не пересоздавали бы ее каждый раз. Создав матрицу, вы можете хранить указатели на каждую ячейку и возвращать их позднее, чтобы удовлетворить последующим запросам. Создайте матрицу указателей ячеек в вашем подклассе таблицы предпочтений. Она должна будет содержать все указатели на ячейки, которые вы создадите позднее: #define NUM_GROUPS 3 #define CELLS_PER_GROUP 4

UiPreferencesTableCell *cells[NUM_GROUPS][CELLS_PER_GROUP]; UiPreferencesTableCell *groupcell[NUM_GROUPS];

Здесь num_groups и cells_per group представляют количество логических групп в таблице предпочтений и максимальное количество ячеек в любой заданной группе. Эти значения будут использоваться для инициализации матрицы при вызове метода таблицы предпочтений initWithFrame, поэтому они задаются здесь как константы.

Инициализация

После создания объекта таблицы предпочтений вы отображаете ее либо путем прикрепления к существующему виду, либо путем перехода к нему из управляющего вида. Это можно сделать, когда пользователь нажимает кнопку настроек, или же автоматически при первом запуске программы. Приведенный далее код порождает созданный вами подкласс MyPreferencesTable: MyPreferencesTable *preferencesTable = [ ( MyPreferencesTable alloc ] initWithFrame: viev;Rect ];

После создания объекта должен быть вызван его метод reloadData для загрузки всех элементов в таблицу предпочтений. Это приведет к тому, что данная таблица вызовет свой источник данных и начнет загрузку информации о группировке и конфигурации ячеек:

[ preferencesTable reloadData ];

Ячейки таблицы предпочтений

Каждая ячейка в таблице предпочтений создается как объект uiPreferencesTableCell или же его подкласс. Ячейки возвращаются посредством метода обратного вызова cellForRow, который вы должны написать и который автоматически вызывается классом таблицы предпочтений, как только новые строки отрисовываются на экране. Например, если метод cellForRow вызывается, задавая строку о группы о. то данный метод может возвращать ячейку, используя, например, такой код:

UiPreferencesTableCell *cell = [ [ UiPreferencesTableCell alloc ] init ]; [ cell setTitle:©"Music Volume" J; [ cell setShowSelection: NO ]; return cell;

Текстовые ячейки

Текстовая ячейка (text cell) является подклассом UiPreferencesTableCell, но спроектирована для отображения (и, необязательно, — для редактирования) текста. Приведенный далее фрагмент кода — пример того, как создать такую ячейку:

UIPreferencesTextTableCell *cell = [

[ UIPreferencesTextTableCell alloc ] init ] ; [ cell setTitle: ©"Version" ]; [ cell setEnabled: NO ]; [ cell setValue: @"1.0.0" J; return cell;

Чтобы разрешить редактирование, воспользуйтесь методом setEnabled: [ cell setEnabled: YES );

Само значение может быть считано с помощью метода значения:

NSString *text = [ cell value ];

Элементы управления

Объект UlPreferencesControlTableCell порожден от базового класса UIPreferencesTableCell и может вмещать элемент управления. Элементы управления могут быть добавлены к обычным объектам

UIPreferencesTableCell                          как                  подвиды,                  но                 класс

UlPreferencesControlTableCell может полностью инкапсулировать элемент управления:

UlPreferencesControlTableCell *cell =

[ [ UlPreferencesControlTableCell alloc ] init ]; UlSliderControl *musicVolumeControl = [ [ UlSliderControl alloc ]

initwithFrame:CGRectMake(170.Of, 5.Of, 120.Of, 55.Of) ]; t musicVolumeControl setMinValue: 0.0 ]; [ musicVolumeControl setMaxValue: 10.0 ]; [ musicVolumeControl setValue: 3.5 ];

[ cell setControl: musicVolumeControl ];

Затем на этот элемент управления можно ссылаться из объекта, что освобождает вас от необходимости хранить указатель на этот элемент управления в вашем классе:

UlSliderControl *musicVolumeControl = [ cell control ];

В данном примере создается элемент управления "бегунок" с фреймом в правой части ячейки предпочтений. Затем бегунок определяется как элемент управления данной ячейки. Все это происходит в методе cellForRow до возвращения только что созданной ячейки.

Отображение таблицы предпочтений

Таблица предпочтений может быть отображена путем добавления ее как ПОДВИДЭ К существующему виду ИЛИ перехода К ней С UITransitionView.

Добавление таблицы предпочтений как подвида происходит следующим образом:

[ self addSubview: preferencesTable ]; а переход может выглядеть примерно так:

[ transitionView transition: 1 toView: preferencesTable ];

Источник: Здзиарски Дж. iPhone. Разработка приложений с открытым кодом: Пер„с англ. — 2-е изд., перераб. и доп. — СПб.: БХВ-Петербург, 2009. — 368 е.: ил.

По теме:

  • Комментарии