Туник Павел Олегович
Факультет компьютерных наук и технологий
Кафедра прикладной математики
Специальность «Программное обеспечение автоматизированных систем»
Исследование эффективности
метода обобщения прототипов
при построении интеллектуальной САПР
в условиях низкой квалификации экперта по знаниям
Научный руководитель: к.т.н., доцент Григорьев Александр Владимирович
Предложение по созданию приложения "DonNTU" для iOS
Создание пользовательских UITableView для приложений в iOS
Введение
В большинстве случаев, выбрав элемент из списка, пользователь загружает подробные сведения по нему в отдельном представлении. “UITableView” отвечает только за отображение списка элементов — переходы от списка к детальному представлению элемента контролирует “UINavigationController“. Таким образом, табличное представление всегда взаимодействует с контроллером навигации, и наоборот.

Вот как выглядит готовое приложение:
Что такое UITableView
UITableView - это табличное представление данных, очень важно понимать что сами данные оно не хранит, только отображает. UITableView - одно из самых популярных представлений в iOS.
С UITableView связано очень много разных задач, таких как:
- Сделать UITableView горизонтальным
- Разместить в ячейке представления кнопку или несколько кнопок
- Разместить в ячейке представления другое UITableView
- Создать UITableView с заданной шириной ячейки
- И многие другие
UITableView имеет множество delegate-методов и DataSource-методов, которые позволяют изменять UITableView в самых разных направлениях, порой даже сложно определить используется UITableView или UIScrollView. Например, можно вставить в ячейку UITableView проигрыватель видео Youtube и если сделать толщину разделителя равной 0, добавить в пердыдущую ячейку текст, то может показаться что мы используем UIWebView.
Мой опыт с UITableView
UITableView крайне популярное представление. За время моей работы я использовал его в самых разнообразных направлениях. Отдельно хочется рассказать про класс UITableViewCell. Хочу привести пример кастомизации UITableView.
Сперва нужно создать класс, который наследуется от UITableViewCell. File -> New File и выбрать класс от которого мы будем наследоваться UITableViewCell subclass. Назовем его ImageCell
Файл заголовок класса
#import
@interface ImageCell : UITableViewCell
{
// добавляем две метки
UILabel *titleLabel;
UILabel *urlLabel;
}
// функции которые будем реализовывать
// метод в котором мы будем выставлять меткам значения
-(void)setData:(NSDictionary *)dict;
// функция для создания меток с параметрами
-(UILabel *)newLabelWithPrimaryColor:(UIColor *)primaryColor
selectedColor:(UIColor *)selectedColor fontSize:(CGFloat)fontSize bold:(BOOL)bold;
// создаем свойства для меток
@property (nonatomic, retain) UILabel *titleLabel;
@property (nonatomic, retain) UILabel *urlLabel;
@end
Переходим к файлу имплементацииImageCell.m.
#import "ImageCell.h"
@implementation ImageCell
// генерируем сеттеры и геттеры для меток
@synthesize titleLabel, urlLabel;
- (id)initWithFrame:(CGRect)frame reuseIdentifier:(NSString *)reuseIdentifier {
if (self = [super initWithFrame:frame reuseIdentifier:reuseIdentifier]) {
// Initialization code
// создаем контейнер для расположения в нем меток.
UIView *myContentView = self.contentView;
/*
инициализируем метку
выставляем выравнивание
добавляем метку как саб-представление к контейнеру
освобождаем память
*/
self.titleLabel = [self newLabelWithPrimaryColor:[UIColor blackColor]
selectedColor:[UIColor whiteColor] fontSize:14.0 bold:YES];
self.titleLabel.textAlignment = UITextAlignmentLeft; // default
[myContentView addSubview:self.titleLabel];
[self.titleLabel release];
/*
делаем тоже самое для второй метки, только с другими параметрами
*/
self.urlLabel = [self newLabelWithPrimaryColor:[UIColor blackColor]
selectedColor:[UIColor lightGrayColor] fontSize:10.0 bold:NO];
self.urlLabel.textAlignment = UITextAlignmentLeft; // default
[myContentView addSubview:self.urlLabel];
[self.urlLabel release];
}
return self;
}
- (void)setSelected:(BOOL)selected animated:(BOOL)animated {
[super setSelected:selected animated:animated];
}
/*
в этой функции мы выставялем значения из словаря для меток
*/
-(void)setData:(NSDictionary *)dict {
self.titleLabel.text = [dict objectForKey:@"title"];
self.urlLabel.text = [dict objectForKey:@"img"];
}
- (void)layoutSubviews {
[super layoutSubviews];
// сохраняем размер ячейки
CGRect contentRect = self.contentView.bounds;
// Редактирование ячеек мы не используем, но в качестве общего шаблона сделаем проверку
if (!self.editing) {
// берем вершину контейнера
CGFloat boundsX = contentRect.origin.x;
CGRect frame;
/*
создаем фрейм для первой метки
*/
frame = CGRectMake(boundsX + 10, 4, 200, 20);
self.titleLabel.frame = frame;
// для второй
frame = CGRectMake(boundsX + 10, 28, 200, 14);
self.urlLabel.frame = frame;
}
}
- (UILabel *)newLabelWithPrimaryColor:(UIColor *)primaryColor
selectedColor:(UIColor *)selectedColor fontSize:(CGFloat)fontSize bold:(BOOL)bold
{
/*
создаем и настраеваем метку.
*/
UIFont *font;
if (bold) {
font = [UIFont boldSystemFontOfSize:fontSize];
} else {
font = [UIFont systemFontOfSize:fontSize];
}
UILabel *newLabel = [[UILabel alloc] initWithFrame:CGRectZero];
newLabel.backgroundColor = [UIColor whiteColor];
newLabel.opaque = YES;
newLabel.textColor = primaryColor;
newLabel.highlightedTextColor = selectedColor;
newLabel.font = font;
return newLabel;
}
- (void)dealloc {
// освобождаем память
[titleLabel dealloc];
[urlLabel dealloc];
[super dealloc];
}
@end
Теперь мы можем использовать наш класс.
Нужно включить его заголовочный файл в RootViewController (viewController в котором нужно использовать ячейку)
#import "ImageCell.h"
Теперь перейдем к основному методу UITableView cellForRowAtIndexPath.Сейчас у нас уже есть инициализация стандартной ячейки UITableViewCell *cell, нам нужно изменить его, чтобы использовать наш ImageCell класс.
ImageCell *cell = (ImageCell *)[tableView dequeueReusableCellWithIdentifier:MyIdentifier];
Также нужно заменить строку cell = в if (cell == nil)
cell = [[[ImageCell alloc] initWithFrame:CGRectZero reuseIdentifier:MyIdentifier] autorelease];
Теперь удаляем строку cell.text и вставляем нашу
NSDictionary *itemAtIndex = (NSDictionary *)[self.jsonArray objectAtIndex:indexPath.row]; [cell setData:itemAtIndex];
Теперь, после того как мы соберем прокект, мы увидим следующее.
Выводы
UITableView очень мощный инструмент для представления данных. Пожалуй, самым главным плюсом является управление памятью, потому что когда в таблице более 12 ячеек, в памяти хранятся только видимые, а остальные буду автоматически созданы/удалены когда появятся на экране/исчезнут с экрана. UITableView - одно из самых популярных представлений в iOS, с его помощью создается простой и интуитивно понятный интерфейс.
Литература
- Custom UITableViewCell in IB [Электронный ресурс]. — Режим доступа: http://iphone.galloway.me.uk/iphone-sdktutorials/custom-uitableviewcell/
- UITableView tutorials [Электронный ресурс]. — Режим доступа: http://www.iphonesdkarticles.com/category/uitableview/page/2
- Easy custom UITableView drawing [Электронный ресурс]. — Режим доступа: http://cocoawithlove.com/2009/04/easy-custom-uitableview-drawing.html
- UITableView Class Reference [Электронный ресурс]. — Режим доступа: http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/...

