Более внимательное рассмотрение в ячейках табличного представления

Табличное представление использует объекты ячейки нарисовать ее видимые строки и затем кэширует те объекты, пока строки видимы. Ячейки наследовались от UITableViewCell класс. Источник данных табличного представления обеспечивает объекты ячейки для табличного представления путем реализации tableView:cellForRowAtIndexPath: метод, требуемый метод UITableViewDataSource протокол.

В этой главе Вы узнаете о:

Характеристики объектов ячейки

Объект ячейки имеет различные части, которые могут измениться в зависимости от режима табличного представления. Обычно, большая часть объекта ячейки резервируется для его содержания: текст, изображение или любой другой вид отличительного идентификатора. Рисунок 5-1 показывает главные части ячейки.

  Части рисунка 5-1 ячейки табличного представления
Parts of a table-view cell

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

То, когда табличное представление входит в режим редактирования, управление редактированием для каждого объекта ячейки (если это сконфигурировано, чтобы иметь такой контроль), появляется на его левой стороне в области, показанной на рисунке 5-2.

  Части рисунка 5-2 ячейки табличного представления в режиме редактирования
Parts of a table-view cell—editing mode

Управление редактированием может быть любой управлением удалением (красный знак «минус» в кругу) или управлением вставкой (зеленый знак «плюс» в кругу). Содержание ячейки продвинуто к праву создать место для управления редактированием. Если объект ячейки сконфигурирован для переупорядочения (т.е. перемещение в табличном представлении), управление переупорядочением появляется в правой стороне ячейки, рядом с любым вспомогательным представление, указанное для режима редактирования. Управление переупорядочением является штабелем горизонтальных строк; для перемещения строки в ее табличном представлении пользователи нажимают на переупорядочении, управляют и перетаскивают ячейку.

Если объект ячейки является допускающим повторное использование — типичный случай — Вы присваиваете его идентификатор повторного использования (произвольная строка) в раскадровке. Во время выполнения табличное представление хранит объекты ячейки во внутренней очереди. Когда табличное представление просит, чтобы источник данных сконфигурировал объект ячейки для дисплея, источник данных может получить доступ к объекту с очередями путем отправки a dequeueReusableCellWithIdentifier: обменивайтесь сообщениями к табличному представлению, передающему в идентификаторе повторного использования. Источник данных устанавливает содержание ячейки и любых специальных свойств прежде, чем возвратить его. Это повторное использование объектов ячейки является улучшением производительности, потому что оно устраняет издержки создания ячейки.

С многократными объектами ячейки в очереди, каждом с ее собственным идентификатором, можно было создать табличные представления из объектов ячейки различных типов. Например, некоторые строки табличного представления могут иметь содержание на основе изображения и текстовых свойств a UITableViewCell в предопределенном стиле, в то время как другие строки могут основываться на специализированном UITableViewCell это определяет специальный формат для его содержания.

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

Используя объекты ячейки в предопределенных стилях

Используя UITableViewCell классифицируйте непосредственно, можно создать «стандартные» объекты ячейки в диапазоне предопределенных стилей. Стандартные стили для Ячеек Табличного представления описывают эти стандартные ячейки и обеспечивают примеры того, как они смотрят в табличном представлении. Эти ячейки связаны со следующим enum константы, объявленные в UITableViewCell.h:

typedef enum {
    UITableViewCellStyleDefault,
    UITableViewCellStyleValue1,
    UITableViewCellStyleValue2,
    UITableViewCellStyleSubtitle
} UITableViewCellStyle;

Эти объекты ячейки имеют два вида содержания: одна или более текстовых строк и, в некоторых случаях, изображение. Рисунок 5-3 показывает приблизительные области для изображения и текста. Поскольку изображение расширяется вправо, оно продвигает текст в том же направлении.

  Содержание ячейки Значения по умолчанию рисунка 5-3 в a UITableViewCell объект
Default cell content in a UITableViewCell object

UITableViewCell класс определяет три свойства для этого содержания ячейки:

Поскольку первые два из этих свойств являются метками, можно установить шрифт, выравнивание, режим разрыва строки и цвет связанного текста через свойства, определенные UILabel класс (включая цвет текста, когда строка выделяется). Для свойства представления изображения можно также установить альтернативное изображение для того, когда ячейка выделяется с помощью highlightedImage свойство UIImageView класс.

Рисунок 5-4 дает пример табличного представления, строки которого нарисованы с помощью a UITableViewCell объект в UITableViewCellStyleSubtitle стиль; это включает и изображение и, для текстового содержания, заголовка и подзаголовка.

Рисунок 5-4  табличное представление со строками, показывающими оба изображения и текст

Перечисление 5-1 показывает реализацию tableView:cellForRowAtIndexPath: это создает строки табличного представления на рисунке 5-4. Первая вещь, которую должен сделать источник данных, отправляют dequeueReusableCellWithIdentifier: к табличному представлению, передающему в идентификаторе повторного использования. Если прототип для ячейки существует в раскадровке, табличное представление возвращает допускающий повторное использование объект ячейки. Тогда это устанавливает содержание объекта ячейки, и текст и изображение.

Перечисление 5-1  , конфигурирующее a UITableViewCell объект и с изображением и с текстом

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:@"MyIdentifier"];
        cell.selectionStyle = UITableViewCellSelectionStyleNone;
    }
    NSDictionary *item = (NSDictionary *)[self.content objectAtIndex:indexPath.row];
    cell.textLabel.text = [item objectForKey:@"mainTitleKey"];
    cell.detailTextLabel.text = [item objectForKey:@"secondaryTitleKey"];
    NSString *path = [[NSBundle mainBundle] pathForResource:[item objectForKey:@"imageKey"] ofType:@"png"];
    UIImage *theImage = [UIImage imageWithContentsOfFile:path];
    cell.imageView.image = theImage;
    return cell;
}

Реализация источника данных табличного представления tableView:cellForRowAtIndexPath: должен всегда сбрасывать все содержание при многократном использовании ячейки.

Когда Вы конфигурируете a UITableViewCell объект, можно также установить различные другие свойства, включая (но не ограничиваясь этим) следующее:

Поскольку ячейка табличного представления наследовалась от UIView, можно также влиять на его появление и поведение путем установки свойств, определенных тем суперклассом. Например, для влияния на цвет фона ячейки Вы могли установить backgroundColor свойство. Перечисление 5-2 показывает, как Вы могли бы использовать метод делегата tableView:willDisplayCell:forRowAtIndexPath: чередовать цвет фона строк (через их ячейки поддержки) в табличном представлении.

Перечисление 5-2  , Чередующее цвет фона ячеек

- (void)tableView:(UITableView *)tableView willDisplayCell:(UITableViewCell *)cell forRowAtIndexPath:(NSIndexPath *)indexPath {
    if (indexPath.row%2 == 0) {
        UIColor *altCellColor = [UIColor colorWithWhite:0.7 alpha:0.1];
        cell.backgroundColor = altCellColor;
    }
}

Перечисление 5-2 также иллюстрирует важный аспект табличного представления API. Табличное представление отправляет a tableView:willDisplayCell:forRowAtIndexPath: обменивайтесь сообщениями его делегату непосредственно перед тем, как это рисует строку. Если делегат принимает решение реализовать этот метод, он может внести изменения на последней минуте в объект ячейки, прежде чем он будет выведен на экран. С этим методом делегат должен изменить только основанные на состоянии свойства, установленные ранее табличным представлением, таким как цвет выделения и цвет фона, и не довольные.

Настройка ячеек

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

Столь гибкий и полезный, как это содержание ячейки, оно не могло бы удовлетворить требования всех приложений. Например, метки разрешены собственным компонентом UITableViewCell объект прикрепляется к определенным расположениям в строке, и изображение должно появиться на левой стороне строки. Если Вы хотите, чтобы ячейка имела различные компоненты содержания и разметила их в различных расположениях, или если Вы хотите различные поведенческие характеристики для ячейки, у Вас есть две альтернативы:

Следующие разделы обсуждают оба подхода.

Загрузка ячеек табличного представления от раскадровки

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

Можно разработать динамическое или статическое содержание ячейки непосредственно в объекте табличного представления. Рисунок 5-5 показывает ведущему устройству и подробным табличным представлениям в простой раскадровке. В этом примере основное табличное представление содержит динамические прототипные ячейки, и подробное табличное представление содержит статические ячейки.

  Ячейки Табличного представления рисунка 5-5 в раскадровке

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

Метод для динамического содержания строки

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

  Строки Табличного представления рисунка 5-6, нарисованные с пользовательской прототипной ячейкой

Источник данных может использовать два различных способа получить доступ к подпредставлениям ячеек. Один подход использует tag свойство, определенное UIView и другой подход использует выходы. Используя теги удобно, несмотря на то, что это делает код более хрупким, потому что это представляет связь между номерами тега в раскадровке и коде. Используя выходы требует немного большего количества работы, потому что необходимо определить пользовательский подкласс UITableViewCell. Оба подхода описаны здесь.

bullet
Создать проект, использующий раскадровку для загрузки пользовательских ячеек табличного представления
  1. Создайте проект с помощью Шаблона приложений Основной Подробности и выберите опцию Use Storyboards.

  2. На холсте раскадровки выберите основной контроллер представления.

  3. В инспекторе Идентификационных данных проверьте, что Класс установлен в пользовательский класс MasterViewController.

  4. Выберите табличное представление в основном контроллере представления.

  5. В инспекторе Атрибутов проверьте, что всплывающее меню Содержания установлено в Динамические Прототипы.

  6. Выберите прототипную ячейку.

  7. В инспекторе Атрибутов выберите Custom во всплывающем меню Стиля.

  8. Введите идентификатор повторного использования в текстовое поле Identifier.

    Это - тот же идентификатор повторного использования, который Вы отправляете в табличное представление в dequeueReusableCellWithIdentifier: сообщение. Для примера см. Перечисление 5-3.

  9. Выберите Disclosure Indicator во Вспомогательном всплывающее меню.

  10. Объекты перетаскивания от Библиотеки на ячейку.

    Для этого примера перетащите два объекта метки и расположите их около концов ячейки (оставляющий комнату для вспомогательного представление).

  11. Выберите объекты и установите их атрибуты, размеры и характеристики автоизменения размеров.

    Важный атрибут для установки для программируемой части этой процедуры является каждым объектом tag свойство. Найдите это свойство в разделе View инспектора Атрибутов и присвойте каждый объект уникальное целое число.

Теперь запишите код, который Вы обычно писали бы для получения данных табличного представления. (Для этого примера единственные данные, в которых Вы нуждаетесь, являются номером строки каждой ячейки.) Реализуют метод источника данных tableView:cellForRowAtIndexPath: создать новую ячейку из прототипа и заполнить его с данными, способом, подобным Перечислению 5-3.

Перечисление 5-3  , Добавляющее данные к ячейке с помощью тегов

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
 
    UILabel *label;
 
    label = (UILabel *)[cell viewWithTag:1];
    label.text = [NSString stringWithFormat:@"%d", indexPath.row];
 
    label = (UILabel *)[cell viewWithTag:2];
    label.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];
 
    return cell;
}

Существует несколько аспектов этого кода для замечания:

  • Идентификатор строки, который Вы присваиваете прототипной ячейке, является той же строкой, в которой Вы передаете табличному представлению dequeueReusableCellWithIdentifier:.

  • Поскольку прототипная ячейка определяется в раскадровке, dequeueReusableCellWithIdentifier: метод всегда возвращает допустимую ячейку. Вы не должны проверить возвращаемое значение по нолю и создать ячейку вручную.

  • Код получает метки в ячейке путем вызова viewWithTag:, передача в их целых числах тега. Это может тогда установить текстовое содержание меток.

Если Вы предпочитаете не использовать теги, можно использовать альтернативный метод для установки содержания в ячейке. Определите пользовательское UITableViewCell подкласс со свойствами выхода для объектов Вы хотите установить. В раскадровке свяжите новый класс с прототипной ячейкой и подключите выходы к соответствующим объектам в ячейке.

bullet
Использовать выходы для пользовательского содержания ячейки
  1. Добавьте названный класс Objective C MyTableViewCell к Вашему проекту.

  2. Добавьте следующий код к интерфейсу в MyTableViewCell.h:

    @interface MyTableViewCell : UITableViewCell
     
    @property (nonatomic, weak) IBOutlet UILabel *firstLabel;
    @property (nonatomic, weak) IBOutlet UILabel *secondLabel;
    @end
  3. Добавьте следующий код к реализации в MyTableViewCell.m:

    @synthesize firstLabel, secondLabel;
  4. Добавьте следующую строку кода к исходному файлу, реализующему источник данных:

    #import "MyTableViewCell.h"
  5. Используйте инспектора Идентификационных данных для установки Класса прототипной ячейки к MyTableViewCell.

  6. Используйте инспектора Соединений для соединения этих двух выходов в прототипной ячейке к их соответствующим меткам.

    ../Art/connect_outlet.jpg
  7. Реализуйте метод источника данных tableView:cellForRowAtIndexPath: способом, подобным Перечислению 5-4.

Перечисление 5-4  , Добавляющее данные к ячейке с помощью выходов

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    MyTableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyIdentifier"];
 
    cell.firstLabel.text = [NSString stringWithFormat:@"%d", indexPath.row];
    cell.secondLabel.text = [NSString stringWithFormat:@"%d", NUMBER_OF_ROWS - indexPath.row];
 
    return cell;
}

Код получает доступ к меткам в ячейке с помощью методов доступа (запись через точку используется здесь). Код может тогда установить текстовое содержание меток.

Метод для статического содержания строки

В этом разделе Вы составляете несколько ячеек в табличном представлении со статическим содержанием. Во время выполнения, когда табличное представление загружается из раскадровки, контроллер табличного представления имеет немедленный доступ к этим ячейкам и составляет разделы и строки табличного представления с ними, как изображено на рисунке 5-7.

  Строки Табличного представления рисунка 5-7, нарисованные с многократными ячейками

Как с процедурой для динамического контента, запустите путем добавления подкласса UITableViewController к Вашему проекту. Определите свойства выхода для основной метки строки в первой ячейке и метки значения ползунка в последней ячейке, как показано в Перечислении 5-5.

Перечисление 5-5  , Определяющее свойства выхода для статических объектов ячейки

@interface DetailViewController : UITableViewController
 
@property (strong, nonatomic) id detailItem;
@property (weak, nonatomic) IBOutlet UILabel *masterRowLabel;
@property (weak, nonatomic) IBOutlet UILabel *sliderValueLabel;
@property (weak, nonatomic) IBOutlet UISlider *slider;
 
- (IBAction)logHello;
- (IBAction)sliderValueChanged:(UISlider *)slider;
 
@end

В раскадровке перетащите объект Контроллера Табличного представления из Библиотеки на холст. Выберите табличное представление и установите следующие атрибуты в инспекторе Атрибутов:

  1. Установите всплывающее меню Содержания в Статические Ячейки.

  2. Определите номер разделов к 2.

  3. Установите всплывающее меню Стиля в Сгруппированный.

Для каждого раздела в табличном представлении используйте инспектора Атрибутов для ввода строки в поле Header. Тогда для ячеек, завершите следующие шаги:

  1. Удалите две из этих трех ячеек в первом разделе табличного представления и одной ячейки во втором разделе.

  2. Увеличьте высоту каждой остальной ячейки по мере необходимости.

    Не необходимо присвоить идентификаторы повторного использования этих ячеек, потому что Вы не собираетесь реализовывать метод источника данных tableView:cellForRowAtIndexPath:.

  3. Объекты перетаскивания от Библиотеки для создания подпредставлений каждой ячейки, как изображено на рисунке 5-7.

  4. Установите любые желаемые атрибуты этих объектов.

    Ползунок в этом примере имеет диапазон значений от 0 до 10 с начальным значением 7,5.

Выберите контроллер табличного представления и выведите на экран инспектора Соединений. Сделайте соединения между этими тремя выходами в Вашем контроллере табличного представления и соответствующих объектах, как показано на рисунке 5-8. В то время как Вы в нем, реализуете эти два метода действия, объявленные в Перечислении 5-5, и делаете соединения целевого действия с кнопкой и ползунком.

  Соединения Создания рисунка 5-8 с Вашим статическим содержанием ячейки

Для заполнения данных в статических ячейках реализуйте вызванный метод configureView в подробности просматривают контроллер. В этом примере, detailItem NSString объект передал в основным контроллером представления в prepareForSegue:sender: метод. Строка содержит основной номер строки.

Перечисление 5-6  , Устанавливающее данные в пользовательском интерфейсе

- (void)configureView
{
    if (self.detailItem) {
        self.masterRowLabel.text = [self.detailItem description];
    }
    self.sliderValueLabel.text = [NSString stringWithFormat:@"%1.1f", self.slider.value];
}

Подробный контроллер представления вызывает configureView метод в viewDidLoad и setDetailItem:, как проиллюстрировано в Приложении Основной Подробности шаблона Xcode.

Программно добавляющие подпредставления к представлению содержания ячейки

Ячейка, которую табличное представление использует для отображения строки, является представлением (UITableViewCell наследовался от UIView). Как представление, ячейка имеет довольное представление — суперпредставление для содержания ячейки — что это представляет как свойство. Для настройки появления строк в табличном представлении добавьте подпредставления к представлению содержания ячейки, которое доступно через contentView свойство, и размечает их в желаемых расположениях в координатах их суперпредставления. Можно сконфигурировать и разметить их программно или в Интерфейсном Разработчике. (Разработчик Интерфейса использования подхода обсужден в Загружающихся Ячейках Табличного представления от Раскадровки.)

Одно преимущество этого подхода является своей относительной простотой; это не требует, чтобы Вы создали пользовательский подкласс UITableViewCell и обработайте все подробные данные реализации, требуемые для пользовательских представлений. Если Вы можете, Однако, если Вы действительно проявляете этот подход, избегаете делать представления прозрачными. Прозрачная производительность прокрутки влияния подпредставлений из-за увеличенного составления композита стоится. Подпредставления должны быть непрозрачными, и обычно должны иметь тот же цвет фона как ячейка. И если ячейка можно выбрать, удостоверьтесь, что содержание ячейки выделяется соответственно, когда выбрано. Если подпредставление реализует (если надлежащий) методы доступа для, содержание выбрано автоматически highlighted свойство.

Предположим, что Вы хотите ячейку с текстом и содержимым изображения в пользовательских расположениях. Например, Вы хотите изображение на правой стороне ячейки и заголовка и подзаголовка ячейки, выровненной по правому краю против левой стороны изображения. Рисунок 5-9 показывает, как могло бы посмотреть табличное представление со строками, нарисованными с такой ячейкой. (Этот пример для иллюстрации только и не предназначается как модель интерфейса пользователя.)

  Ячейки рисунка 5-9 с пользовательским содержанием как подпредставления

Пример кода в Перечислении 5-7 иллюстрирует, как источник данных программно составляет ячейку, с которой это табличное представление рисует свои строки. В tableView:cellForRowAtIndexPath:, это сначала проверяет, чтобы видеть, что табличное представление уже имеет объект ячейки с данным идентификатором повторного использования. Если нет такого объекта, источник данных создает два объекта метки и одно представление изображения с определенными кадрами в системе координат их суперпредставления (довольное представление). Это также устанавливает атрибуты этих объектов. Получив надлежащую ячейку для использования источник данных устанавливает содержание ячейки прежде, чем возвратить ячейку.

  Добавление перечисления 5-7 подпросматривает к представлению содержания ячейки

#define MAINLABEL_TAG 1
#define SECONDLABEL_TAG 2
#define PHOTO_TAG 3
 
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
 
    static NSString *CellIdentifier = @"ImageOnRightCell";
 
    UILabel *mainLabel, *secondLabel;
    UIImageView *photo;
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
        cell.accessoryType = UITableViewCellAccessoryDetailDisclosureButton;
 
        mainLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 0.0, 220.0, 15.0)];
        mainLabel.tag = MAINLABEL_TAG;
        mainLabel.font = [UIFont systemFontOfSize:14.0];
        mainLabel.textAlignment = UITextAlignmentRight;
        mainLabel.textColor = [UIColor blackColor];
        mainLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview:mainLabel];
 
        secondLabel = [[UILabel alloc] initWithFrame:CGRectMake(0.0, 20.0, 220.0, 25.0)];
        secondLabel.tag = SECONDLABEL_TAG;
        secondLabel.font = [UIFont systemFontOfSize:12.0];
        secondLabel.textAlignment = UITextAlignmentRight;
        secondLabel.textColor = [UIColor darkGrayColor];
        secondLabel.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview:secondLabel];
 
        photo = [[UIImageView alloc] initWithFrame:CGRectMake(225.0, 0.0, 80.0, 45.0)];
        photo.tag = PHOTO_TAG;
        photo.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | UIViewAutoresizingFlexibleHeight;
        [cell.contentView addSubview:photo];
    } else {
        mainLabel = (UILabel *)[cell.contentView viewWithTag:MAINLABEL_TAG];
        secondLabel = (UILabel *)[cell.contentView viewWithTag:SECONDLABEL_TAG];
        photo = (UIImageView *)[cell.contentView viewWithTag:PHOTO_TAG];
    }
    NSDictionary *aDict = [self.list objectAtIndex:indexPath.row];
    mainLabel.text = [aDict objectForKey:@"mainTitleKey"];
    secondLabel.text = [aDict objectForKey:@"secondaryTitleKey"];
    NSString *imagePath = [[NSBundle mainBundle] pathForResource:[aDict objectForKey:@"imageKey"] ofType:@"png"];
    UIImage *theImage = [UIImage imageWithContentsOfFile:imagePath];
    photo.image = theImage;
 
    return cell;
}

Когда источник данных создает ячейки, он присваивает каждое подпредставление, идентификатор вызвал тег. С тегами можно определить местоположение представления в его иерархии представления путем вызова viewWithTag: метод. Если делегат позже получает определяемую ячейку от очереди табличного представления, она использует теги для получения ссылок на три подпредставления до присвоения их содержание.

Этот код создает a UITableViewCell объект в предопределенном стиле по умолчанию (UITableViewCellStyleDefault). Поскольку свойства содержания стандартных ячеек —textLabel, detailTextLabel, и imageViewnil до присвоенного содержания можно использовать любую предопределенную ячейку в качестве шаблона для настройки.

Один способ достигнуть “приписанной строки” эффекты с текстовым содержанием состоит в том, чтобы разметить UILabel подпредставления UITableViewCell довольный представление. Текст каждой метки может иметь свой собственный шрифт, цвет, размер, выравнивание и другие характеристики. Если Вы хотите такое изменение в объекте метки, создаете многократные метки и размечаете их друг относительно друга.

Улучшение доступности ячеек табличного представления

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

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

Вы, вероятно, распознали, что ячейка таблицы, содержащая многократные элементы, такие как текст и средства управления, соответствует критериям контейнерного представления, как определено интерфейсом программирования Доступности UI. Однако Вы не должны идентифицировать ячейку как контейнерное представление или реализовать любой из методов UIAccessibilityContainer протокол, потому что ячейка таблицы автоматически определяется как контейнер.

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

Хороший пример того, как это может работать, находится во встроенном приложении Акций. Вместо того, чтобы обеспечить название компании, текущий курс акций и изменение цен как отдельные строки, Акции комбинируют эту информацию в метке, которая могла бы походить на это: “Apple Inc., 648,11$, выше на 1,85%». Заметьте запятые в этой метке. При объединении дискретных данных таким образом можно использовать запятые, чтобы сказать VoiceOver приостанавливаться кратко между фразами, упрощающими для пользователей понять информацию.

Перечисление 5-8 показывает, как объединиться, информация в метках два разделяют элементы на единственную метку, описывающую обоих:

Перечисление 5-8  , Связывающее метки ячейки таблицы

@implementation WeatherTableViewController
// This is a view that provides weather information. It contains a city subview and a temperature subview, each of which provides a separate label.
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
 
    // set up the cell here...
 
    NSString *cityLabel = [self.weatherCity accessibilityLabel];
    NSString *temperatureLabel = [self.weatherTemp accessibilityLabel];
 
    // Combine the city and temperature information so that VoiceOver users can get the weather information with one gesture.
    [cell setAccessibilityLabel:[NSString stringWithFormat:@"%@, %@", cityLabel, temperatureLabel]];
    return cell;
}
@end

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

Ячейки и производительность табличного представления

Надлежащее использование ячеек табличного представления, или стандартные или пользовательские объекты ячейки, являются основным фактором в производительности табличных представлений. Гарантируйте, что Ваше приложение делает следующие три вещи: