Создание и конфигурирование табличного представления
Ваше приложение должно представить табличное представление пользователям, прежде чем оно сможет управлять им в ответ на касания на строках и других действиях. Эта глава показывает то, что необходимо сделать для создания табличного представления, сконфигурировать его и заполнить его с данными.
Большинство примеров кода, показанных в этой главе, прибывает из демонстрационных проектов Основные принципы TableView для iOS и TheElements.
Основы создания табличного представления
Для создания табличного представления несколько объектов в приложении должны взаимодействовать: контроллер представления, само табличное представление, и источник данных табличного представления и делегат. Контроллер представления, источник данных и делегат обычно являются тем же объектом. Контроллер представления запускает вызывающую последовательность, схематически изображенную на рисунке 4-1.
Контроллер представления создает a
UITableView
экземпляр в определенном кадре и стиле. Это может сделать это или программно или в раскадровке. Кадр обычно устанавливается в экранный кадр, минус высота строки состояния или, в основанном на навигации приложении, к экранному кадру минус высоты строки состояния и панели навигации. Контроллер представления может также установить глобальные свойства табличного представления в этой точке, такие как ее поведение автоизменения размеров или глобальная высота строки.Чтобы изучить, как создать табличные представления в раскадровке и программно, посмотрите Создание Табличного представления Используя Раскадровку и Создания Табличного представления Программно.
Контроллер представления устанавливает источник данных и делегата табличного представления и отправляет a
reloadData
обменивайтесь сообщениями к нему. Источник данных должен принятьUITableViewDataSource
протокол и делегат должны принятьUITableViewDelegate
протокол.Источник данных получает a
numberOfSectionsInTableView:
сообщение отUITableView
возразите и возвращает число разделов в табличном представлении. Несмотря на то, что это - дополнительный метод протокола, источник данных должен реализовать его, если табличное представление имеет больше чем один раздел.Для каждого раздела источник данных получает a
tableView:numberOfRowsInSection:
обменивайтесь сообщениями и отвечает путем возврата числа строк для раздела.Источник данных получает a
tableView:cellForRowAtIndexPath:
сообщение для каждой видимой строки в табличном представлении. Это отвечает путем конфигурирования и возврата aUITableViewCell
объект для каждой строки.UITableView
возразите использует эту ячейку для рисования строки.
Схема на рисунке 4-1 показывает методы требуемого протокола, а также numberOfSectionsInTableView:
метод. Заполнение табличного представления с данными происходит на шагах 3 - 5. Чтобы изучить, как реализовать методы на этих шагах, посмотрите Заполнение Динамического Табличного представления с Данными.
Источник данных и делегат могут реализовать другие дополнительные методы их протоколов для дальнейшего конфигурирования табличного представления. Например, источник данных мог бы хотеть обеспечить заголовки для каждого из разделов в табличном представлении путем реализации tableView:titleForHeaderInSection:
метод. Для больше на некоторых из этих настроек представления необязательной таблицы, посмотрите Конфигурации Представления Необязательной таблицы.
Вы создаете табличное представление в любом стандартный стиль (UITableViewStylePlain
) или сгруппированный стиль (UITableViewStyleGrouped
). (Вы указываете стиль в раскадровке.) Несмотря на то, что процедура для создания табличного представления в любом стили идентична, можно хотеть выполнить различные виды конфигураций. Например, потому что сгруппированное табличное представление обычно представляет подробность элемента, можно также хотеть добавить пользовательские представления аксессуара (например, переключатели и ползунки) или пользовательское содержание (например, текстовые поля). Для примера посмотрите Более внимательное рассмотрение в Ячейках Табличного представления.
Рекомендации для создания и конфигурирования табличных представлений
Существует много способов соединить приложение табличного представления. Например, можно использовать экземпляр пользовательского NSObject
подкласс для создания сконфигурируйте и управляйте табличным представлением. Однако Вы сочтете задачу намного проще при принятии классов, методов и шаблонов разработки, которые платформа UIKit предлагает с этой целью. Следующие подходы рекомендуются:
Используйте экземпляр подкласса
UITableViewController
создать и управлять табличным представлением.Большинство приложений использует пользовательское
UITableViewController
объект управлять табличным представлением. Как описано в Навигации по Иерархии Данных с Табличными представлениями,UITableViewController
автоматически создает табличное представление, присваивает себя и как делегат и как источник данных (и принимает соответствующие протоколы), и инициирует процедуру для заполнения табличного представления с данными. Это также заботится о нескольких других подробных данных «обслуживания» поведения. ПоведениеUITableViewController
(подклассUIViewController
) в навигации архитектура контроллера описана в Контроллерах Табличного представления.Если Ваше приложение в основном основано на табличных представлениях, выберите Master-Detail Application template, предоставленный XCode при создании проекта.
Как описано в Создании Табличного представления Используя Раскадровку, шаблон включает тупиковый код и раскадровку, определяющую делегата приложения, контроллер навигации и основной контроллер представления (который является экземпляром пользовательского подкласса
UITableViewController
).Для последовательных табличных представлений необходимо реализовать пользовательский
UITableViewController
объекты. Можно или загрузить их из раскадровки или создать связанные табличные представления программно.Несмотря на то, что любая опция возможна, маршрут раскадровки обычно проще.
Если представление, которое будет управляемо, является составным представлением, в котором табличное представление является одним из многократных подпредставлений, необходимо использовать пользовательский подкласс UIViewController
управлять табличным представлением (и другие представления). Не использовать UITableViewController
, потому что этот класс контроллера измеряет табличное представление для заполнения экрана между панелью навигации и панелью вкладок (если любой присутствует).
Создание табличного представления Используя раскадровку
Создайте приложение с табличным представлением с помощью XCode. При создании проекта выберите шаблон, содержащий тупиковый код и раскадровку, по умолчанию, предоставляющие структуру для установки и управления табличными представлениями.
В XCode выберите File> New> Project.
В разделе iOS в левой стороне диалогового окна выберите Application.
В основной области диалогового окна выберите Master-Detail Application и затем нажмите Далее.
Выберите Ваши опции проекта (удостоверьтесь, что Раскадровка Использования выбрана), и затем нажмите Далее.
Выберите расположение сохранения для своего проекта и затем нажмите Create.
В зависимости от которого семейства устройства Вы выбрали на шаге 4, проект имеет одну или две раскадровки. Для отображения холста раскадровки дважды щелкните по файлу раскадровки в навигаторе проекта. Если семейство устройства является iPhone, например, Ваша раскадровка должна содержать контроллер табличного представления, выглядящий подобным тому на рисунке 4-2.
На холсте щелкните по строке заголовка сцены для выбора контроллера табличного представления.
Нажмите кнопку Identity наверху служебной области для открытия инспектора Идентификационных данных.
Проверьте, что поле Class содержит пользовательский подкласс проекта
UITableViewController
.
Выберите стиль отображения табличного представления
Как описано в Стилях Табличного представления, каждое табличное представление имеет стиль отображения: плоскость или сгруппированный.
Выберите тип контента табличного представления
Раскадровки представляют два удобных способа разработать содержание табличного представления:
Динамические прототипы. Разработайте прототипную ячейку и затем используйте ее в качестве шаблона для других ячеек в таблице. Используйте динамический прототип, когда многократные ячейки в таблице должны будут использовать то же расположение для отображения информации. Динамическим контентом управляет источник данных табличного представления (контроллер табличного представления) во время выполнения с произвольным числом ячеек. Рисунок 4-3 показывает простое табличное представление с одной прототипной ячейкой.
Статические ячейки. Используйте статическое содержание для разработки полного расположения таблицы, включая общее количество ячеек. Табличное представление со статическим содержанием имеет фиксированный набор ячеек, которые можно сконфигурировать во время проектирования. Можно также сконфигурировать другие статические элементы данных, такие как заголовки раздела. Используйте статические ячейки, когда таблица не изменяет свое расположение, независимо от определенной информации она выводит на экран. Рисунок 4-4 показывает сгруппированное табличное представление с тремя статическими ячейками.
По умолчанию, когда Вы добавляете контроллер табличного представления к раскадровке, контроллер содержит табличное представление, использующее основанные на прототипе ячейки. Если Вы хотите использовать статические ячейки:
Выберите табличное представление.
Выведите на экран инспектора Атрибутов.
Во всплывающее меню Содержания, выберите Static Cells.
Когда источник данных исключает допускающие повторное использование ячейки из очереди для таблицы во время выполнения, при разработке прототипной ячейки для табличного представления нужен способ идентифицировать прототип. Вы делаете это путем присвоения идентификатора повторного использования ячейке. В разделе Table View Cell инспектора Атрибутов введите строку в текстовое поле Identifier, которое Вы будете также использовать при выяснении новую ячейку того типа. Для создания понимания кода проще идентификатор повторного использования ячейки должен описать то, что содержит ячейка. Например, ячейка для отображения наблюдений за птицей могла бы иметь идентификатор @”BirdSightingCell”
.
Разработайте строки табличного представления
Как описано в Стандартных стилях для Ячеек Табличного представления, UIKit определяет четыре стиля для ячеек, которые табличное представление использует для рисования его строк. Можно использовать один из этих четырех стандартных стилей, разработать пользовательский стиль или подкласс UITableViewCell
определить дополнительное поведение или свойства для ячейки. Эта тема затронута подробно в Более внимательном рассмотрении в Ячейках Табличного представления.
Ячейка табличного представления может также иметь аксессуар, как описано во Вспомогательном Представления. Аксессуар является стандартным элементом пользовательского интерфейса, который UIKit рисует в правильном конце ячейки таблицы. Например, индикатор раскрытия, выглядящий подобным правой угловой скобке (>), говорит пользователям, что ответвление элемента показывает соответствующую информацию на новом экране. В инспекторе Атрибутов используйте Аксессуар pop‐up меню для выбора аксессуара ячейки.
Создайте дополнительные табличные представления
Если Ваши отображения приложения и управляют больше чем одним табличным представлением, добавьте те табличные представления к своей раскадровке. Вы добавляете табличное представление путем добавления пользовательского UITableViewController
объект, содержащий табличное представление, которым он управляет.
В XCode выберите File> New> File.
В разделе iOS в левой стороне диалогового окна выберите Cocoa Touch.
В основной области диалогового окна выберите класс Objective-C, и затем нажмите Далее.
Введите имя для своего нового класса, выберите подкласс
UITableViewController
, и затем нажмите Далее.Выберите расположение сохранения для своих файлов класса, и затем нажмите Create.
Выведите на экран раскадровку, к которой Вы хотите добавить контроллер табличного представления.
Перетащите контроллер табличного представления из библиотеки объектов и отбросьте ее на раскадровке.
С новой сценой, все еще выбранной на холсте, нажмите кнопку Identity в служебной области для открытия инспектора Идентификационных данных.
В разделе Custom Class выберите новый пользовательский класс во всплывающем меню Класса.
Установите стиль нового табличного представления и содержание ячейки (динамичный или статичный).
Создайте переход к новой сцене.
Подробные данные шага 7 варьируются в зависимости от проекта. Для узнавания больше о добавлении переходов см. Обзор XCode.
Узнайте больше путем создания демонстрационного приложения
Учебное руководство Ваше Второе приложение для iOS: Раскадровки показывают, как создать демонстрационное приложение, структурированное вокруг табличных представлений. После завершения шагов в этом учебном руководстве у Вас будет практическое знание того, как создать и динамические и статические табличные представления с помощью раскадровки. Учебное руководство создает основное основанное на навигации приложение под названием BirdWatching, использующий контроллеры табличного представления, подключенные и нажатием и модальными переходами.
Создание табличного представления программно
Если Вы принимаете решение не использовать UITableViewController
для управления табличным представлением необходимо тиражировать то, что этот класс дает Вам «бесплатно».
Примите источник данных и делегируйте протоколы
Класс, создающий табличное представление обычно, делает себя источником данных и делегатом путем принятия UITableViewDataSource
и UITableViewDelegate
протоколы. Синтаксис принятия появляется сразу после суперкласса в @interface
директива, как показано в Перечислении 4-1.
Перечисление 4-1 , Принимающее источник данных и протоколы делегата
@interface RootViewController : UIViewController <UITableViewDelegate, UITableViewDataSource> |
@property (nonatomic, strong) NSArray *timeZoneNames; |
@end |
Создайте и сконфигурируйте табличное представление
Следующий шаг для клиента, чтобы выделить и инициализировать экземпляр UITableView
класс. Перечисление 4-2 дает пример клиента, создающего a UITableView
объект в стандартном стиле, указывает свои характеристики автоизменения размеров, и затем устанавливает себя, чтобы быть и источником данных и делегатом. Снова, имейте в виду что UITableViewController
делает все это для Вас автоматически.
Перечисление 4-2 , Создающее табличное представление
- (void)loadView |
{ |
UITableView *tableView = [[UITableView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame] style:UITableViewStylePlain]; |
tableView.autoresizingMask = UIViewAutoresizingFlexibleHeight|UIViewAutoresizingFlexibleWidth; |
tableView.delegate = self; |
tableView.dataSource = self; |
[tableView reloadData]; |
self.view = tableView; |
} |
Поскольку в этом примере класс, создающий табличное представление, является подклассом UIViewController
, это присваивает создаваемое табличное представление view
свойство, которое это наследовало от того класса. Это также отправляет a reloadData
обменивайтесь сообщениями к табличному представлению, заставляя табличное представление инициировать процедуру для заполнения ее разделов и строк с данными.
Заполнение динамического табличного представления с данными
Сразу после того, как объект табличного представления создается, он получает a reloadData
сообщение, говорящее ему начинать запрашивать источник данных и делегировать для получения информации, в которой это нуждается для разделов и строк, которые это выводит на экран. Табличное представление сразу просит у источника данных свои логические размерности — т.е. число разделов и число строк в каждом разделе. Это тогда неоднократно вызывает tableView:cellForRowAtIndexPath:
метод для получения ячейки возражает для каждой видимой строки; это использует это UITableViewCell
возразите для рисования содержания строки. (Прокрутка табличного представления также вызывает вызов tableView:cellForRowAtIndexPath:
для каждой недавно видимой строки.)
Как отмечено в Выбирают Table View's Content Type, если табличное представление является динамичным тогда, необходимо реализовать требуемые методы источника данных. Перечисление 4-3 показывает пример того, как источник данных и делегат могли сконфигурировать динамическое табличное представление.
Перечисление 4-3 , Заполняющее динамическое табличное представление с данными
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { |
return [regions count]; |
} |
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { |
// Number of rows is the number of time zones in the region for the specified section. |
Region *region = [regions objectAtIndex:section]; |
return [region.timeZoneWrappers count]; |
} |
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { |
// The header for the section is the region name -- get this from the region at the section index. |
Region *region = [regions objectAtIndex:section]; |
return [region name]; |
} |
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
static NSString *MyIdentifier = @"MyReuseIdentifier"; |
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:MyIdentifier]; |
if (cell == nil) { |
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:MyIdentifier]; |
} |
Region *region = [regions objectAtIndex:indexPath.section]; |
TimeZoneWrapper *timeZoneWrapper = [region.timeZoneWrappers objectAtIndex:indexPath.row]; |
cell.textLabel.text = timeZoneWrapper.localeName; |
return cell; |
} |
Источник данных, в его реализации tableView:cellForRowAtIndexPath:
метод, возвращается, сконфигурированная ячейка возражают, что табличное представление может использовать для рисования строки. По причинам производительности источник данных пытается снова использовать ячейки как можно больше. Это сначала просит у табличного представления определенный допускающий повторное использование объект ячейки путем отправки ему a dequeueReusableCellWithIdentifier:
сообщение. Если никакой такой объект не существует, источник данных создает его, присваивая его идентификатор повторного использования. Источник данных устанавливает содержание ячейки (в этом примере, его тексте) и возвращает его. Более внимательное рассмотрение в Ячейках Табличного представления обсуждает этот метод источника данных и UITableViewCell
объекты более подробно.
Если dequeueReusableCellWithIdentifier:
метод просит ячейку, это определяется в раскадровке, метод всегда возвращает допустимую ячейку. Если нет переработанной ячейки, ожидающей, чтобы быть снова использованной, метод создает новый с помощью информации в самой раскадровке. Это избавляет от необходимости проверять возвращаемое значение на nil
и создайте ячейку вручную.
Реализация tableView:cellForRowAtIndexPath:
метод в Перечислении 4-3 включает NSIndexPath
параметр, идентифицирующий раздел табличного представления и строку. UIKit объявляет категорию NSIndexPath
класс, определяющийся в платформе Основы. Эта категория расширяет класс для включения идентификации строк табличного представления разделом и номером строки. Для получения дополнительной информации об этой категории посмотрите дополнения NSIndexPath UIKit.
Заполнение статического табличного представления с данными
Как отмечено в Выбирают Table View's Content Type, если табличное представление статично тогда, Вы не должны реализовывать методы источника данных. Конфигурация табличного представления известна во время компиляции, таким образом, UIKit может получить эту информацию от раскадровки во время выполнения. Однако все еще необходимо заполнить статическое табличное представление с данными от модели данных. Заполнение Статического Табличного представления С Данными показывает пример того, как контроллер табличного представления мог загрузить пользовательские данные в статическом табличном представлении. Этот пример адаптируется из Вашего Второго приложения для iOS: Раскадровки.
Перечисление 4-4 , Заполняющее статическое табличное представление с данными
- (void)viewDidLoad |
{ |
[super viewDidLoad]; |
BirdSighting *theSighting = self.sighting; |
static NSDateFormatter *formatter = nil; |
if (formatter == nil) { |
formatter = [[NSDateFormatter alloc] init]; |
[formatter setDateStyle:NSDateFormatterMediumStyle]; |
} |
if (theSighting) { |
self.birdNameLabel.text = theSighting.name; |
self.locationLabel.text = theSighting.location; |
self.dateLabel.text = [formatter stringFromDate:(NSDate*)theSighting.date]; |
} |
} |
Табличное представление заполняется с данными в UIViewController
метод viewDidLoad
, который вызывают после того, как представление загружается в память. Данные передаются контроллеру табличного представления в sighting
объект, установленный в предыдущем контроллере представления prepareForSegue:sender:
метод. Свойства birdNameLabel
, locationLabel
, и dateLabel
выходы, подключенные к меткам в статическом табличном представлении (см. рисунок 4-4).
Заполнение индексируемого списка
Индексируемый список (см. рисунок 1-2) идеально подходит для навигации по большим объемам данных, организованным стандартной схемой упорядочивания, таким как алфавит. Индексируемый список является табличным представлением в стандартном стиле, особенно сконфигурированном до три UITableViewDataSource
методы:
sectionIndexTitlesForTableView:
Возвращает массив строк для использования в качестве элементов индекса (в порядке).
tableView:titleForHeaderInSection:
Карты эти, которые индекс представляет в виде строки к заголовкам разделов табличного представления (они не должны быть тем же).
tableView:sectionForSectionIndexTitle:atIndex:
Возвращает индекс раздела, связанный с записью пользователь, коснувшийся в индексе.
Данные, которые Вы используете для заполнения индексируемого списка, должны быть организованы для отражения этой модели индексации. В частности необходимо создать массив массивов. Каждый внутренний массив соответствует разделу в таблице. Массивы раздела сортированы (или сопоставлены) во внешнем массиве согласно господствующей схеме упорядочивания, которая часто является алфавитной схемой (например, через Z). Кроме того, элементы в каждом массиве раздела сортируются. Можно создать и сортировать этот массив массивов сами, но к счастью UILocalizedIndexedCollation
класс значительно упрощает задачи создания и сортировки этих структур данных и предоставления данных табличному представлению. Класс также сопоставляет элементы в массивах согласно текущей локализации.
Однако, Вы внутренне управляете, эта структура массива массивов ваше дело. Объекты, которые будут сопоставлены, должны иметь свойство или метод, возвращающий строковое значение что UILocalizedIndexedCollation
класс использует в сопоставлении; если это - метод, это не должно иметь никаких параметров. Вы могли бы счесть удобным определить пользовательский класс модели, экземпляры которого представляют строки в табличном представлении. Эти объекты модели не только возвращают строковое значение, но также и определяют свойство, содержащее индекс массива раздела, которому присваивается объект. Перечисление 4-5 иллюстрирует определение класса, объявляющего a name
свойство и a sectionNumber
свойство.
Перечисление 4-5 , Определяющее интерфейс объекта модели
@interface State : NSObject |
@property(nonatomic,copy) NSString *name; |
@property(nonatomic,copy) NSString *capitol; |
@property(nonatomic,copy) NSString *population; |
@property NSInteger sectionNumber; |
@end |
Прежде чем Ваш контроллер табличного представления просят заполнить табличное представление, Вы загружаете данные, которые будут использоваться (из любого источника), и создаете экземпляры Вашего класса модели от этих данных. Пример в Перечислении 4-6 загружает данные, определенные в списке свойств, и создает объекты модели из этого. Это также получает совместно используемый экземпляр UILocalizedIndexedCollation
и инициализирует непостоянный массив (states
) это будет содержать массивы раздела.
Перечисление 4-6 , Загружающее данные табличного представления и инициализирующее объекты модели
- (void)viewDidLoad { |
[super viewDidLoad]; |
UILocalizedIndexedCollation *theCollation = [UILocalizedIndexedCollation currentCollation]; |
self.states = [NSMutableArray arrayWithCapacity:1]; |
NSString *thePath = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"]; |
NSArray *tempArray; |
NSMutableArray *statesTemp; |
if (thePath && (tempArray = [NSArray arrayWithContentsOfFile:thePath]) ) { |
statesTemp = [NSMutableArray arrayWithCapacity:1]; |
for (NSDictionary *stateDict in tempArray) { |
State *aState = [[State alloc] init]; |
aState.name = [stateDict objectForKey:@"Name"]; |
aState.population = [stateDict objectForKey:@"Population"]; |
aState.capitol = [stateDict objectForKey:@"Capitol"]; |
[statesTemp addObject:aState]; |
} |
} else { |
return; |
} |
После того, как источник данных имеет этот «необработанный» массив объектов модели, это может обработать его со средствами UILocalizedIndexedCollation
класс. В Перечислении 4-7 код аннотируется числами.
Перечисление 4-7 , Подготавливающее данные к индексируемому списку
// viewDidLoad continued... |
// (1) |
for (State *theState in statesTemp) { |
NSInteger sect = [theCollation sectionForObject:theState collationStringSelector:@selector(name)]; |
theState.sectionNumber = sect; |
} |
// (2) |
NSInteger highSection = [[theCollation sectionTitles] count]; |
NSMutableArray *sectionArrays = [NSMutableArray arrayWithCapacity:highSection]; |
for (int i = 0; i < highSection; i++) { |
NSMutableArray *sectionArray = [NSMutableArray arrayWithCapacity:1]; |
[sectionArrays addObject:sectionArray]; |
} |
// (3) |
for (State *theState in statesTemp) { |
[(NSMutableArray *)[sectionArrays objectAtIndex:theState.sectionNumber] addObject:theState]; |
} |
// (4) |
for (NSMutableArray *sectionArray in sectionArrays) { |
NSArray *sortedSection = [theCollation sortedArrayFromArray:sectionArray |
collationStringSelector:@selector(name)]; |
[self.states addObject:sortedSection]; |
} |
} // end of viewDidLoad |
Вот то, что делает код в Перечислении 4-7:
Источник данных перечисляет массив объектов модели и отправляет
sectionForObject:collationStringSelector:
менеджеру по сопоставлению на каждой итерации. Этот метод берет в качестве параметров объект модели и свойство или метод объекта, который это использует в сопоставлении. Каждый вызов возвращает индекс массива раздела, которому принадлежит объект модели, и то значение присваиваетсяsectionNumber
свойство.Источник источника данных тогда создает (временный) внешний непостоянный массив и непостоянные массивы для каждого раздела; это добавляет каждый создаваемый массив раздела к внешнему массиву.
Это тогда перечисляет массив объектов модели и добавляет каждый объект к его присвоенному массиву раздела.
Источник данных перечисляет массив массивов раздела и вызовов
sortedArrayFromArray:collationStringSelector:
на менеджере по сопоставлению для сортировки элементов в каждом массиве. Это передает в массиве раздела и свойстве или методе, который должен использоваться в сортировке элементов в массиве. Каждый сортированный массив раздела добавляется к заключительному внешнему массиву.
Теперь источник данных готов заполнить свое табличное представление с данными. Это реализует методы, определенные для индексируемых списков как показано в Перечислении 4-8. В выполнении этого это вызывает два UILocalizedIndexedCollation
методы: sectionIndexTitles
и sectionForSectionIndexTitleAtIndex:
. Также отметьте это в tableView:titleForHeaderInSection:
когда связанный раздел не имеет никаких элементов, это подавляет любые заголовки от появления в табличном представлении.
Перечисление 4-8 , Предоставляющее данные индекса раздела табличному представлению
- (NSArray *)sectionIndexTitlesForTableView:(UITableView *)tableView { |
return [[UILocalizedIndexedCollation currentCollation] sectionIndexTitles]; |
} |
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { |
if ([[self.states objectAtIndex:section] count] > 0) { |
return [[[UILocalizedIndexedCollation currentCollation] sectionTitles] objectAtIndex:section]; |
} |
return nil; |
} |
- (NSInteger)tableView:(UITableView *)tableView sectionForSectionIndexTitle:(NSString *)title atIndex:(NSInteger)index |
{ |
return [[UILocalizedIndexedCollation currentCollation] sectionForSectionIndexTitleAtIndex:index]; |
} |
Наконец, источник данных должен реализовать UITableViewDataSource
методы, которые характерны для всех табличных представлений. Перечисление 4-9 дает примеры этих реализаций и иллюстрирует, как использовать section
и row
свойства специфичной для табличного представления категории NSIndexPath
класс описан в дополнениях NSIndexPath UIKit.
Перечисление 4-9 , Заполняющее строки индексируемого списка
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { |
return [self.states count]; |
} |
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { |
return [[self.states objectAtIndex:section] count]; |
} |
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { |
static NSString *CellIdentifier = @"StateCell"; |
UITableViewCell *cell; |
cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; |
if (cell == nil) { |
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; |
} |
State *stateObj = [[self.states objectAtIndex:indexPath.section] objectAtIndex:indexPath.row]; |
cell.textLabel.text = stateObj.name; |
return cell; |
} |
Для табличных представлений, индексирующихся списки, когда источник данных присваивает ячейки для строк в tableView:cellForRowAtIndexPath:
, это должно гарантировать что accessoryType
свойство ячейки установлено в UITableViewCellAccessoryNone
.
После начального заполнения табличного представления, выполняющего процедуру, обрисовал в общих чертах выше, можно перезагрузить содержание индекса путем вызова reloadSectionIndexTitles
метод.
Конфигурации представления необязательной таблицы
Табличное представление API позволяет Вам конфигурировать различные визуальные и поведенческие аспекты табличного представления, включая определенные строки и разделы. Следующие примеры служат для давания Вам некоторое представление об опциях, доступных Вам.
Добавьте пользовательский заголовок
В том же блоке кода, создающем табличное представление, можно применить глобальные конфигурации с помощью определенных методов UITableView
класс. Пример кода в Перечислении 4-10 добавляет пользовательский заголовок для табличного представления (использующий a UILabel
объект).
Перечисление 4-10 , Добавляющее заголовок к табличному представлению
- (void)loadView |
{ |
CGRect titleRect = CGRectMake(0, 0, 300, 40); |
UILabel *tableTitle = [[UILabel alloc] initWithFrame:titleRect]; |
tableTitle.textColor = [UIColor blueColor]; |
tableTitle.backgroundColor = [self.tableView backgroundColor]; |
tableTitle.opaque = YES; |
tableTitle.font = [UIFont boldSystemFontOfSize:18]; |
tableTitle.text = [curTrail objectForKey:@"Name"]; |
self.tableView.tableHeaderView = tableTitle; |
[self.tableView reloadData]; |
} |
Обеспечьте заголовок раздела
Пример в Перечислении 4-11 возвращает строку заголовка для раздела.
Перечисление 4-11 Возвращая заголовок для раздела
- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section { |
// Returns section title based on physical state: [solid, liquid, gas, artificial] |
return [[[PeriodicElements sharedPeriodicElements] elementPhysicalStatesArray] objectAtIndex:section]; |
} |
Расположите строку с отступом
Код в Перечислении 4-12 перемещает определенную строку в следующий уровень добавления отступа.
Перечисление 4-12 Пользовательское добавление отступа строки
- (NSInteger)tableView:(UITableView *)tableView indentationLevelForRowAtIndexPath:(NSIndexPath *)indexPath { |
if ( indexPath.section==TRAIL_MAP_SECTION && indexPath.row==0 ) { |
return 2; |
} |
return 1; |
} |
Варьируйтесь высота строки
Пример в Перечислении 4-13 варьируется высота определенной строки на основе ее индексного значения.
Перечисление 4-13 Переменная высота строки
- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath |
{ |
CGFloat result; |
switch ([indexPath row]) |
{ |
case 0: |
{ |
result = kUIRowHeight; |
break; |
} |
case 1: |
{ |
result = kUIRowLabelHeight; |
break; |
} |
} |
return result; |
} |
Настройте ячейки
Можно также влиять на появление строк путем возврата пользовательский UITableViewCell
объекты со специально отформатированными подпредставлениями для содержания в tableView:cellForRowAtIndexPath:
. Настройка ячейки обсуждена в Более внимательном рассмотрении в Ячейках Табличного представления.