Yandex Mobile Camp в Санкт-Петербурге, 30 мая 2012
Алексей Патосин, iOS-разработчик, Yota Lab.
Тема: Как можно доработать UITableViewController, чтобы облегчить себе жизнь
Тезисы:
Рассмотрим проблемы, с которыми сталкивался каждый, работая с таблицами в Cocoa Touch.
Как можно улучшить существующий подход, как элегантно избавиться от «копипасты» и сфокусироваться только на том, какие данные и в какой структуре показывать. Разработанный подход позволяет свести написание кода при создании таких таблиц и форм к минимуму.
5. Какие бывают таблицы?
1. Списки однородных элементов 2. Формы (1-... сущностей)
(всё не так страшно) (сейчас немного поковыряем)
4
6. Сложные формы
Ночной кошмар, если таблица динамическая
Показывать всегда Показывать всегда
Телефон +7(800)123-666-7 Телефон +7(800)123-666-7
Email steve@apple.com Email steve@apple.com
Добавить поле Добавить поле
Сейчас онлайн Сейчас онлайн
Ringo Star Ringo Star
Jimmy Page
5 мин
5 мин 10 мин
10 мин 15 мин
15 мин Полчаса
Полчаса Если выбрано 15 минут и больше,
то тут появляется этот текст
5
7. Типичные способы управления сложной таблицей
– Гроздь switch/case
– State machine
– Разруливание вариантов гроздями наследников
6
8. Минусы использования UITableViewController
(обо что спотыкался каждый)
– Настройка таблиц через UITableViewControllerDelegate
(хочется задать все параметры в конструкторе/билдере)
– Заполнение и обновление таблицы через UITableViewControllerDataSource
(мы ненавидим indexPath)
– Работа с ячейкой
(ячейка “не знает”, что на неё нажали)
7
10. Чего хочется?
– Абстрагироваться от работы с таблицей и работать с
данными
– Хочется, чтобы таблица стала более “smart”
- таблица знала когда себя обновлять
- ячейки знали когда себя обновлять
- модель знала, что происходит в ячейках
– Хочется реинвентить дата биндинг под iOS
9
12. “smart” ячейка таблицы
Хочется, чтобы ячейка стала самостоятельным
элементом и знала:
model view
+7 800 123 6667
что показывать (model > view)
10
13. “smart” ячейка таблицы
Хочется, чтобы ячейка стала самостоятельным
элементом и знала:
model
view
+7 800 123
что обновлять (view changed > model changed)
model view
+7 800 123 6667
10
14. “smart” ячейка таблицы
Хочется, чтобы ячейка стала самостоятельным
элементом и знала:
view
model
+7 800 123 4567
когда обновлять (model changed > view changed)
model view model
view
+7 800 123 6667
+7 800 123
10
24. Мы выделили следующие типы ячеек
– Push
Добавить поле
– State
- Switch
Показывать всегда
- Check 10 мин
– Edit Email steve@apple.com
- Flexible edit Телефон +7(800)123-666-7
– Text Сейчас онлайн 12/32
13
26. Какая главная особенность “smart” ячейки?
При создании ячейки действие задаётся через блок
[cell setCalledBlock:^{
NSLog(@"Hello there..");
}];
Действия:
- нажатие на ячейке
- нажатие на переключателе
- ввод текста в ячейке
accessoryType появляется автоматически, если задан calledBlock 15
27. Какие вкусности есть у “smart” таблицы?
Оптимизированная работа с нотификациями NSNotification с
использованием блока
[self addNotificationObserver:@"NotificationName"
object:_jet
usingBlock:^(NSNotification *notification){
//do smth
} calledBlockImmediately:YES];
(сейчас увидим как это работает) 16
28. Какие вкусности есть у “smart” таблицы?
Нотификации очищаются самостоятельно, если не нужна
другая логика
- (void) removeNotificationObservers{
[_notifications enumerateKeysAndObjectsUsingBlock:^(id key, id obj, BOOL *stop) {
[[NSNotificationCenter defaultCenter] removeObserver:obj];
}];
[_notifications removeAllObjects];
}
- (void) dealloc{
[self removeNotificationObservers];
[_notifications release];
[super dealloc];
}
нотификации храняться в словаре, следовательно один инстанс viewController не может
хранить несколько нотификаций с одинаковыми именами 17
45. Некоторые нюансы специфичных ячеек
StateTableViewCell и её потомки Check и Switch
[cell setCalledBlock:^{
bself.jet.isOn = ! bself.jet.isOn;
}];
21
48. Что есть ещё?
Ячейка помимо блоков может использовать классическую
конструкцию delegate, selector, object1, object2
cell.delegate = self;
cell.selector = @selector(doSmth:);
cell.object1ToAction = obj;
24
49. Что есть ещё?
Ячейка может на событие вызывать viewController имя
которого задано при её создании
cell.viewControllerNameForPush = @”PilotViewController”;
25
50. Что есть ещё?
Таблица содержит гибкий механизм обновления секций и ячеек
insertSection:atIndex:
insertCell:inSection:atIndex:
insertCells:inSection:atIndex:
removeSection:
removeCell:inSection:
replaceSection:withSection:
replaceCell:inSection:withCell:
replaceSectionWithArrayOfSections:
(для обращения к нужной секции или ячейки используется её
уникальный идентификатор, задаваемый при создании)
26