Главная » iPhone » Списки разделов iPhone

0

Об объекте uiTable вы узнали в главе 3 как о средстве отображения списков выбора информации. Когда таблица становится достаточно большой, то нахождение в ней какого-либо определенного элемента становится сродни поиску иголки в стоге сена. Класс uiSectionList предоставляет структуру, аналогичную uiTable, но расширенную и включающую в себя отдельные группировки ячеек и панель прокрутки типа Rolodex для быстрого перехода к заголовку раздела. Каждой группировке может быть сопоставлен заголовок раздела наподобие жанра книг или первой букве контакта. Списки разделов (section lists) применяются в собственных контактах iPhone и списках песен.

Класс UISectionList инкапсулирует UISectionTable, который заключает в себе табличную часть списка. Как и другие таблицы, список разделов использует привязку данных (data binding). Привязка данных — это интерфейс к источнику данных, к которому обращается таблица за содержимым и структурой таблицы. Источник данных для списка разделов предоставляет методы обратного вызова, необходимые для построения группировок списка разделов, заголовков разделов и отдельных ячеек строк.

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

Создание списка разделов

Чтобы создать список разделов, который помимо всего сможет высту пать в роли собственного источника данных, унаследуйте UISectionList. Приведенный далее код создает класс MySectionList, содержащий методы как для списка разделов, так и для его источника данных:

@interface MySectionList : UISectionList {

UISectionTable *table;

}

/* Методы списка разделов */

-   (id)initwithFrame:(CGRect)rect;

-   (void)dealloc;

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

-   (int)numberOfSectionsInSectionList:(UISectionList *)aSectionList;

-   (NSString *)sectionList: (UISectionList *)aSectionList titleForSection:(int)section;

-   (int)sectionList: (UISectionList *)aSectionList rowForSection:(int)section;

-   (int) numberOfRowsinTable: (UiTable *)table;

-  (UlTableCell *) table: (UiTable *)table ceilForRow: (int)row

column: (int)col;

@end

На объект uiSectionList работают следующие методы источника данных:

?   NumberOf Sect ions insect ionList — возвращает количество разделов, т. е. количество заголовков различных категорий, в списке разделов. Например, если ваше приложение было бы менеджером списка контактов, то вы бы определили 26 разделов (по одному на каждую букву). Пустые разделы должны быть выброшены из списка разделов, уменьшив тем самым это количество;

?   titleForSection— каждый раздел имеет заголовок, даже если он состоит всего лишь из одной буквы. Если бы ваше приложение было книжным магазином, то заголовки ваших разделов могли бы включать такие названия, как "Computer Science" и "Reference". Метод titleForSection вызывается тогда, когда требуется название для заданного раздела. Он предоставляет в качестве аргумента порядковый номер раздела и возвращает объект NSString, содержащий соответствующее название;

?   rowForSection— каждая строка в списке разделов помечается номером. Строка должна быть связана с разделом, которому она принадлежит, так чтобы она могла отображаться под корректным заголовком раздела. Список разделов исходит из того, что в рамках массива строк вашего приложения каждый раздел имеет последовательный ряд строк.

Метод rowForSection запрашивает номер начальной строки вашего списка строк в соответствии с заданным разделом. Например, если во всей вашей таблице имеется 10 строк, то первый раздел может начинаться со строки 0, а второй раздел — со строки 7. Список разделов будет понимать это как то, что строки с 0 по 6 соответствуют первому разделу, а строки с 7 по 10 — второму;

?   numberOfRowsinTable — этот метод возвращает полное количество строк в данном списке разделов по всем разделам;

?   ceilForRow — отдельные строки инкапсулируются объектами UlTableCell. Этот объект уже обсуждался в разд. "Таблицы" ранее в этой главе. Поскольку строки в списке разделов относятся к видимому фрейму экрана, то данный метод запрашивает возвращение ячейки заданной строки.

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

Чтобы построить полнофункциональный список разделов, необходимо запрограммировать все описанные в предыдущем разделе методы. Мы покажем один из вариантов их написания в нашем примере в конце этого раздела.

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

UISectionList *sectionList = [ [ MySectionList alloc ] initwithFrame: windowRect ];

Как и в случае с классом UITable, для инициализации источника данных должен быть вызван метод reloadData. Чтобы загрузить информацию для отображения в строках, разделах и заголовках разделов списка, этот метод может быть подменен вашим подклассом:

[ sectionList reloadData ];

Получение доступа к объекту таблицы

Список разделов представляет свои данные путем инкапсулирования объекта uiSectionTabie. Этот класс порожден от базового класса UITable и ведет себя схожим образом. Сама таблица должна также быть инициализирована так, чтобы иметь для отображения информации, по крайней мере, один столбец таблицы. Список разделов содержит метод table, который возвращает указатель на объект UiSectionTabie. Этот объект был создан внутренне вместе с объектом списка разделов.

Приведенный далее код в методе initwithFrame объекта MySectionList предназначен для инициализации табличной части списка:

UiSectionTabie *table = [ self table ]; UITableColumn * column = [ [ UITableColumn alloc ] initWithTitle:@"Column Name" identifier:@"column" width: 320.0 ]; [ table addTableColumn: column ]; [ table setSeparatorStyle: 1 ];

[ table setRowHeight: 48.0 ]; [ table setDelegate: self ];

Методы, использованные для конфигурации табличной части списка разделов, идентичны объекту uiTable, описанному в главе 3. Здесь должен быть создан, по крайней мере, один столбец и заданы различные атрибуты таблицы.

Отображение списка разделов

Список разделов может быть отображен путем задания его в качестве содержимого окна, добавления его как подвида к существующему виду или перехода его к использованию класса uiTransitionview, описанного в главе 3.

Чтобы задать список разделов в качестве содержимого окна, воспользуйтесь

setContentView:

[ window setContentView: sectionList ];

Чтобы добавить список разделов как подвид, вызовите addSubview: [ self addSubview: sectionList ];

Чтобы использовать переходной вид для перехода к списку разделов, воспользуйтесь следующим кодом:

[ transitionView transition: 1 toView: sectionList ];

Как только список разделов будет отображен, строки, попавшие в зону видимости, станут толчком для списка запросить метод cellForRow. Этот метод возвращает объект uiTableCell для запрошенной строки. Более подробную информацию о классе UiTableCell см. в разд. "Таблицы"ранее в этой главе.

События выбора

Когда пользователь в списке разделов выбирает какой-либо элемент, вызывается метод tableRowSelected. Затем этот метод выполняет все необходимые приложению операции.

Встроенный табличный метод selectedRow возвращает количество строк, выбранных пользователем:

- (void)tableRowSelected:(NSNotification *)notification { int rowSelected = [ table selectedRow ] ]; /* Делайте здесь что-нибудь */

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

По теме:

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