SlideShare une entreprise Scribd logo
1  sur  51
Télécharger pour lire hors ligne
Yandex Mobile Camp
         Санкт-Петербург




Как можно доработать
 UITableViewController
   чтобы облегчить себе жизнь




                                Патосин Алексей
                                        YotaLab
Agenda
1. Проблемы работы с таблицами под iOS

2. У нас есть решение

3. We need to go deeper




                                              1
Давайте поговорим о Cocoa таблицах
Таблицы вокруг нас




                 3
Какие бывают таблицы?
1. Списки однородных элементов        2. Формы (1-... сущностей)
  (всё не так страшно)                  (сейчас немного поковыряем)




                                                                      4
Сложные формы
                 Ночной кошмар, если таблица динамическая
Показывать всегда                        Показывать всегда

Телефон               +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
Типичные способы управления сложной таблицей


 – Гроздь switch/case

 – State machine

 – Разруливание вариантов гроздями наследников




                                                 6
Минусы использования UITableViewController
                                      (обо что спотыкался каждый)


– Настройка таблиц через UITableViewControllerDelegate
      (хочется задать все параметры в конструкторе/билдере)


– Заполнение и обновление таблицы через UITableViewControllerDataSource
       (мы ненавидим indexPath)

– Работа с ячейкой
       (ячейка “не знает”, что на неё нажали)




                                                                          7
Чего хочется?
Чего хочется?

– Абстрагироваться от работы с таблицей и работать с
данными

– Хочется, чтобы таблица стала более “smart”
        - таблица знала когда себя обновлять
        - ячейки знали когда себя обновлять
        - модель знала, что происходит в ячейках

– Хочется реинвентить дата биндинг под iOS




                                                           9
“smart” ячейка таблицы

Хочется, чтобы ячейка стала самостоятельным
элементом и знала:




                                              10
“smart” ячейка таблицы

Хочется, чтобы ячейка стала самостоятельным
элементом и знала:



        model                    view

                                   +7 800 123 6667




             что показывать (model > view)




                                                     10
“smart” ячейка таблицы

Хочется, чтобы ячейка стала самостоятельным
элементом и знала:



             model
                                         view

                                             +7 800 123




             что обновлять (view changed > model changed)


     model        view

                   +7 800 123 6667




                                                            10
“smart” ячейка таблицы

Хочется, чтобы ячейка стала самостоятельным
элементом и знала:



                                                             view
                      model
                                                              +7 800 123 4567




             когда обновлять (model changed > view changed)


     model        view               model
                                              view
                   +7 800 123 6667
                                                +7 800 123




                                                                                10
Houston, we have a solution
Структура таблицы

Lorem ipsum dolor sit amet, consectetuer
  adipiscing elit. Aenean consectetuer.


Abra

Cadabra

Caramba

Lorem ipsum dolor sit amet, consectetuer
  adipiscing elit. Aenean consectetuer.




                                                           12
Структура таблицы
                                           section
Lorem ipsum dolor sit amet, consectetuer
  adipiscing elit. Aenean consectetuer.


Abra

Cadabra

Caramba

Lorem ipsum dolor sit amet, consectetuer
  adipiscing elit. Aenean consectetuer.




                                                            12
Структура таблицы
                                           section
Lorem ipsum dolor sit amet, consectetuer
  adipiscing elit. Aenean consectetuer.


Abra

     Cadabra

Caramba

Lorem ipsum dolor sit amet, consectetuer
  adipiscing elit. Aenean consectetuer.




                                                            12
Структура таблицы
                                           section
Lorem ipsum dolor sit amet, consectetuer        cells
  adipiscing elit. Aenean consectetuer.


Abra

     Cadabra

Caramba

Lorem ipsum dolor sit amet, consectetuer
  adipiscing elit. Aenean consectetuer.




                                                            12
Структура таблицы
                                           section
Lorem ipsum dolor sit amet, consectetuer        cells
  adipiscing elit. Aenean consectetuer.


Abra
                                                headerTitle
     Cadabra                                    headerView
Caramba                                         headerHeight
Lorem ipsum dolor sit amet, consectetuer        footerTitle
  adipiscing elit. Aenean consectetuer.
                                                footerView
                                                footerHeight




                                                               12
Структура таблицы
                                           section
Lorem ipsum dolor sit amet, consectetuer        cells
  adipiscing elit. Aenean consectetuer.


Abra
                                                headerTitle
     Cadabra                                    headerView
Caramba                                         headerHeight
Lorem ipsum dolor sit amet, consectetuer        footerTitle
  adipiscing elit. Aenean consectetuer.
                                                footerView
                                                footerHeight




                                                               12
Структура таблицы
                                           section
Lorem ipsum dolor sit amet, consectetuer        cells
                                                    cellActions
  adipiscing elit. Aenean consectetuer.


Abra
                                                headerTitle
     Cadabra                                    headerView
Caramba                                         headerHeight
Lorem ipsum dolor sit amet, consectetuer        footerTitle
  adipiscing elit. Aenean consectetuer.
                                                footerView
                                                footerHeight




                                                                  12
Мы выделили следующие типы ячеек




                               13
Мы выделили следующие типы ячеек

– Push
                       Добавить поле




– State
    - Switch
                       Показывать всегда


    - Check            10 мин




– Edit                 Email           steve@apple.com

    - Flexible edit    Телефон         +7(800)123-666-7




– Text                 Сейчас онлайн              12/32




                                                          13
SmartTableViewController

 UITableViewController                     UITableViewControllerDelegate



                                          UITableViewControllerDataSource



SmartTableViewController


                                                                     UITableViewCell




 TableSectionContainer                                          AbstractSmartTableViewCell




                                           PushTableViewCell                                 TextTableViewCell




                                            EditTableViewCell                          AbstractStateTableViewCell




                           FlexibleEditTableViewCell                  SwitchTableViewCell                        CheckTableViewCell




                                                                                                                                      14
Какая главная особенность “smart” ячейки?

При создании ячейки действие задаётся через блок

     [cell setCalledBlock:^{
         NSLog(@"Hello there..");
     }];




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


    accessoryType появляется автоматически, если задан calledBlock   15
Какие вкусности есть у “smart” таблицы?

    Оптимизированная работа с нотификациями NSNotification с
    использованием блока

    [self addNotificationObserver:@"NotificationName" 
                            object:_jet 
                       usingBlock:^(NSNotification *notification){
                          //do smth
                       } calledBlockImmediately:YES];




                                 (сейчас увидим как это работает)   16
Какие вкусности есть у “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
Как заполнять структуру таблицы

- (void)updateSections{
    [super updateSections];
    
    [sections addObject:[self pilotSection]];
    [sections addObject:[self jetSection]];
    [sections addObject:[self weaponSection]]; 
    
    [self.tableView reloadData];
}




                                                  18
Как заполнять структуру таблицы

- (void)updateSections{
    [super updateSections];
       
    [sections addObject:[self pilotSection]];
    [sections addObject:[self jetSection]];
    [sections addObject:[self weaponSection]]; 
    
    [self.tableView reloadData];
}




                                                  18
Как заполнять структуру таблицы

- (void)updateSections{
    [super updateSections];
       
    [sections addObject:[self pilotSection]];
    [sections addObject:[self jetSection]];
    [sections addObject:[self weaponSection]]; 
    
    [self.tableView reloadData];
}




                                                  18
Как заполнять структуру таблицы

- (void)updateSections{
    [super updateSections];
       
    [sections addObject:[self pilotSection]];
    [sections addObject:[self jetSection]];
    [sections addObject:[self weaponSection]]; 
    
    [self.tableView reloadData];
}




                                                  18
Как создавать секции

- (TableSectionContainer *)pilotSection{
    TableSectionContainer *section = [TableSectionContainer
                                                sectionWithSectionId:pilotSectionId];
    
    section.headerTitle = @"Pilot";
        
    [section.cells addObject:[self pilotCell]];
    
    [section setFooterTitle:@"pilot name and range are required"];
    [section setFooterHeight:20];      
    
    return section;
}




                                                                                        19
Как создавать секции

- (TableSectionContainer *)pilotSection{
    TableSectionContainer *section = [TableSectionContainer
                                                sectionWithSectionId:pilotSectionId];
    
    section.headerTitle = @"Pilot";
        
    [section.cells addObject:[self pilotCell]];
    
    [section setFooterTitle:@"pilot name and range are required"];
    [section setFooterHeight:20];      
    
    return section;
}




                                                                                        19
Как создавать секции

- (TableSectionContainer *)pilotSection{
    TableSectionContainer *section = [TableSectionContainer
                                                sectionWithSectionId:pilotSectionId];
    
    section.headerTitle = @"Pilot";
        
    [section.cells addObject:[self pilotCell]];
    
    [section setFooterTitle:@"pilot name and range are required"];
    [section setFooterHeight:20];      
    
    return section;
}




                                                                                        19
Как создавать секции

- (TableSectionContainer *)pilotSection{
    TableSectionContainer *section = [TableSectionContainer
                                                sectionWithSectionId:pilotSectionId];
    
    section.headerTitle = @"Pilot";
        
    [section.cells addObject:[self pilotCell]];
    
    [section setFooterTitle:@"pilot name and range are required"];
    [section setFooterHeight:20];      
    
    return section;
}




                                                                                        19
Как создавать секции

- (TableSectionContainer *)pilotSection{
    TableSectionContainer *section = [TableSectionContainer
                                                sectionWithSectionId:pilotSectionId];
    
    section.headerTitle = @"Pilot";
        
    [section.cells addObject:[self pilotCell]];
    
    [section setFooterTitle:@"pilot name and range are required"];
    [section setFooterHeight:20];      
    
    return section;
}




                                                                                        19
Как создавать ячейки
- (PushTableViewCell *)pilotCell{
    PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];
    
    __block typeof(self) bself = self;
    
    [cell setCalledBlock:^{
        [bself showPilotViewController];
    }];
    
    [self addNotificationObserver:@"PilotNameChanged"
                           object:_jet.pilot 
                       usingBlock: ^(NSNotification *notification){
                            cell.textLabel.text = [NSString 
                                           stringWithFormat:@"%@ %@",
                                           bself.jet.pilot.pilotName,
                                           [bself.jet.pilot pilotRangeDescription]];  
                            }
           calledBlockImmediately:YES];
    
    return cell;
}




                                                                                     20
Как создавать ячейки
- (PushTableViewCell *)pilotCell{
    PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];
    
    __block typeof(self) bself = self;
    
    [cell setCalledBlock:^{
        [bself showPilotViewController];
    }];
    
    [self addNotificationObserver:@"PilotNameChanged"
                           object:_jet.pilot 
                       usingBlock: ^(NSNotification *notification){
                            cell.textLabel.text = [NSString 
                                           stringWithFormat:@"%@ %@",
                                           bself.jet.pilot.pilotName,
                                           [bself.jet.pilot pilotRangeDescription]];  
                            }
           calledBlockImmediately:YES];
    
    return cell;
}




                                                                                     20
Как создавать ячейки
- (PushTableViewCell *)pilotCell{
    PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];
    
    __block typeof(self) bself = self;
    
    [cell setCalledBlock:^{
        [bself showPilotViewController];
    }];
    
    [self addNotificationObserver:@"PilotNameChanged"
                           object:_jet.pilot 
                       usingBlock: ^(NSNotification *notification){
                            cell.textLabel.text = [NSString 
                                           stringWithFormat:@"%@ %@",
                                           bself.jet.pilot.pilotName,
                                           [bself.jet.pilot pilotRangeDescription]];  
                            }
           calledBlockImmediately:YES];
    
    return cell;
}




                                                                                     20
Как создавать ячейки
- (PushTableViewCell *)pilotCell{
    PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];
    
    __block typeof(self) bself = self;
    
    [cell setCalledBlock:^{
        [bself showPilotViewController];
    }];
    
    [self addNotificationObserver:@"PilotNameChanged"
                           object:_jet.pilot 
                       usingBlock: ^(NSNotification *notification){
                            cell.textLabel.text = [NSString 
                                           stringWithFormat:@"%@ %@",
                                           bself.jet.pilot.pilotName,
                                           [bself.jet.pilot pilotRangeDescription]];  
                            }
           calledBlockImmediately:YES];
    
    return cell;
}




                                                                                     20
Как создавать ячейки
- (PushTableViewCell *)pilotCell{
    PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];
    
    __block typeof(self) bself = self;
    
    [cell setCalledBlock:^{
        [bself showPilotViewController];
    }];
    
    [self addNotificationObserver:@"PilotNameChanged"
                           object:_jet.pilot 
                       usingBlock: ^(NSNotification *notification){
                            cell.textLabel.text = [NSString 
                                           stringWithFormat:@"%@ %@",
                                           bself.jet.pilot.pilotName,
                                           [bself.jet.pilot pilotRangeDescription]];  
                            }
           calledBlockImmediately:YES];
    
    return cell;
}




                                                                                     20
Как создавать ячейки
- (PushTableViewCell *)pilotCell{
    PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];
    
    __block typeof(self) bself = self;
    
    [cell setCalledBlock:^{
        [bself showPilotViewController];
    }];
    
    [self addNotificationObserver:@"PilotNameChanged"
                           object:_jet.pilot 
                       usingBlock: ^(NSNotification *notification){
                            cell.textLabel.text = [NSString 
                                           stringWithFormat:@"%@ %@",
                                           bself.jet.pilot.pilotName,
                                           [bself.jet.pilot pilotRangeDescription]];  
                            }
           calledBlockImmediately:YES];
    
    return cell;
}




                                                                                     20
Как создавать ячейки
- (PushTableViewCell *)pilotCell{
    PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];
    
    __block typeof(self) bself = self;
    
    [cell setCalledBlock:^{
        [bself showPilotViewController];
    }];
    
    [self addNotificationObserver:@"PilotNameChanged"
                           object:_jet.pilot 
                       usingBlock: ^(NSNotification *notification){
                            cell.textLabel.text = [NSString 
                                           stringWithFormat:@"%@ %@",
                                           bself.jet.pilot.pilotName,
                                           [bself.jet.pilot pilotRangeDescription]];  
                            }
           calledBlockImmediately:YES];
    
    return cell;
}




                                                                                     20
Некоторые нюансы специфичных ячеек

StateTableViewCell и её потомки Check   и Switch


      [cell setCalledBlock:^{
          bself.jet.isOn = ! bself.jet.isOn;
      }];




                                                   21
Некоторые нюансы специфичных ячеек

EditTableViewCell


      [cell setCalledBlock:^{
          bself.jet.pilotName = cell.valueTextField.text;   
                                                            
      }];




                                                               22
Некоторые нюансы специфичных ячеек

FlexibleEditTableViewCell


  typedef void(^CalledBlock)(void);
  typedef BOOL(^ShouldChangeCharactersInRange)(NSRange range, NSString *string);
  typedef BOOL(^TextFieldShouldReturnBlock)(void);
  typedef BOOL(^TextFieldShouldClearBlock)(void);

  ShouldChangeCharactersInRange _shouldChangeCharactersInRangeBlock;
  TextFieldShouldReturnBlock _textFieldShouldReturnBlock;
  TextFieldShouldClearBlock _textFieldShouldClearBlock;
  CalledBlock _textFieldDidBeginEditingBlock;
  CalledBlock _textFieldDidEndEditingBlock;




                                                                              23
Что есть ещё?
Ячейка помимо блоков может использовать классическую
конструкцию delegate, selector, object1, object2
   cell.delegate = self;
   cell.selector = @selector(doSmth:);
   cell.object1ToAction = obj;




                                                       24
Что есть ещё?
Ячейка может на событие вызывать viewController имя
которого задано при её создании

  cell.viewControllerNameForPush = @”PilotViewController”;




                                                         25
Что есть ещё?
Таблица содержит гибкий механизм обновления секций и ячеек

      insertSection:atIndex:
      insertCell:inSection:atIndex:
      insertCells:inSection:atIndex:
      removeSection:
      removeCell:inSection:
      replaceSection:withSection:
      replaceCell:inSection:withCell:
      replaceSectionWithArrayOfSections:




                 (для обращения к нужной секции или ячейки используется её
                 уникальный идентификатор, задаваемый при создании)
                                                                             26
Thank you!


alexey.patosin.ru
alexey@patosin.ru
@gn0meavp


SmartTableViewController:
http://bit.ly/N8hcMe

Contenu connexe

En vedette

Алексей Андросов — Debugger: Отладка кода
Алексей Андросов — Debugger: Отладка кодаАлексей Андросов — Debugger: Отладка кода
Алексей Андросов — Debugger: Отладка кодаYandex
 
Дмитрий Агафонов "Поиск фраз в документах Рекламной Сети Яндекса"
 Дмитрий Агафонов "Поиск фраз в документах Рекламной Сети Яндекса" Дмитрий Агафонов "Поиск фраз в документах Рекламной Сети Яндекса"
Дмитрий Агафонов "Поиск фраз в документах Рекламной Сети Яндекса"Yandex
 
Михаил Хохлов «Математическая модель для прогнозирования пробок»
Михаил Хохлов «Математическая модель для прогнозирования пробок» Михаил Хохлов «Математическая модель для прогнозирования пробок»
Михаил Хохлов «Математическая модель для прогнозирования пробок» Yandex
 
Ольга Мегорская "Качество поиска: экспертные оценки и исследование пользовате...
Ольга Мегорская "Качество поиска: экспертные оценки и исследование пользовате...Ольга Мегорская "Качество поиска: экспертные оценки и исследование пользовате...
Ольга Мегорская "Качество поиска: экспертные оценки и исследование пользовате...Yandex
 
Владимир Билоненко "Как мы делаем code review"
Владимир Билоненко "Как мы делаем code review"Владимир Билоненко "Как мы делаем code review"
Владимир Билоненко "Как мы делаем code review"Yandex
 
Patient Engagement via Social Media
Patient Engagement via Social MediaPatient Engagement via Social Media
Patient Engagement via Social MediaSebastian Koelsch
 
Сергей Сергеев "Git — ветки, деревья, лес"
Сергей Сергеев "Git — ветки, деревья, лес"Сергей Сергеев "Git — ветки, деревья, лес"
Сергей Сергеев "Git — ветки, деревья, лес"Yandex
 
The BUsiness of Windows Azure Platform
The BUsiness of Windows Azure PlatformThe BUsiness of Windows Azure Platform
The BUsiness of Windows Azure PlatformDan Moore
 
Особенности фоновой работы iOS-приложения на примере синхронизации Яндекс.Ди...
 Особенности фоновой работы iOS-приложения на примере синхронизации Яндекс.Ди... Особенности фоновой работы iOS-приложения на примере синхронизации Яндекс.Ди...
Особенности фоновой работы iOS-приложения на примере синхронизации Яндекс.Ди...Yandex
 
Максим Ширшин — Регулярные выражения
Максим Ширшин — Регулярные выраженияМаксим Ширшин — Регулярные выражения
Максим Ширшин — Регулярные выраженияYandex
 
Semana Santa Torrejon 2015: Procesion del Encuentro en Domingo de Resurreccion
Semana Santa Torrejon 2015: Procesion del Encuentro en Domingo de ResurreccionSemana Santa Torrejon 2015: Procesion del Encuentro en Domingo de Resurreccion
Semana Santa Torrejon 2015: Procesion del Encuentro en Domingo de ResurreccionTelescopioDigital
 
Олег Мохов "CSS3 фарш"
Олег Мохов "CSS3 фарш"Олег Мохов "CSS3 фарш"
Олег Мохов "CSS3 фарш"Yandex
 
Apresentação leila exposiçao
Apresentação leila exposiçaoApresentação leila exposiçao
Apresentação leila exposiçaoleilatutora
 

En vedette (19)

Алексей Андросов — Debugger: Отладка кода
Алексей Андросов — Debugger: Отладка кодаАлексей Андросов — Debugger: Отладка кода
Алексей Андросов — Debugger: Отладка кода
 
Дмитрий Агафонов "Поиск фраз в документах Рекламной Сети Яндекса"
 Дмитрий Агафонов "Поиск фраз в документах Рекламной Сети Яндекса" Дмитрий Агафонов "Поиск фраз в документах Рекламной Сети Яндекса"
Дмитрий Агафонов "Поиск фраз в документах Рекламной Сети Яндекса"
 
Михаил Хохлов «Математическая модель для прогнозирования пробок»
Михаил Хохлов «Математическая модель для прогнозирования пробок» Михаил Хохлов «Математическая модель для прогнозирования пробок»
Михаил Хохлов «Математическая модель для прогнозирования пробок»
 
Ольга Мегорская "Качество поиска: экспертные оценки и исследование пользовате...
Ольга Мегорская "Качество поиска: экспертные оценки и исследование пользовате...Ольга Мегорская "Качество поиска: экспертные оценки и исследование пользовате...
Ольга Мегорская "Качество поиска: экспертные оценки и исследование пользовате...
 
Владимир Билоненко "Как мы делаем code review"
Владимир Билоненко "Как мы делаем code review"Владимир Билоненко "Как мы делаем code review"
Владимир Билоненко "Как мы делаем code review"
 
Patient Engagement via Social Media
Patient Engagement via Social MediaPatient Engagement via Social Media
Patient Engagement via Social Media
 
договор мбдоу 25 с родителями
договор мбдоу 25 с родителямидоговор мбдоу 25 с родителями
договор мбдоу 25 с родителями
 
Guide 2012
Guide 2012Guide 2012
Guide 2012
 
Kahit saan!
Kahit saan! Kahit saan!
Kahit saan!
 
Сергей Сергеев "Git — ветки, деревья, лес"
Сергей Сергеев "Git — ветки, деревья, лес"Сергей Сергеев "Git — ветки, деревья, лес"
Сергей Сергеев "Git — ветки, деревья, лес"
 
The BUsiness of Windows Azure Platform
The BUsiness of Windows Azure PlatformThe BUsiness of Windows Azure Platform
The BUsiness of Windows Azure Platform
 
Siemens Bauherren Checkliste
Siemens Bauherren ChecklisteSiemens Bauherren Checkliste
Siemens Bauherren Checkliste
 
Особенности фоновой работы iOS-приложения на примере синхронизации Яндекс.Ди...
 Особенности фоновой работы iOS-приложения на примере синхронизации Яндекс.Ди... Особенности фоновой работы iOS-приложения на примере синхронизации Яндекс.Ди...
Особенности фоновой работы iOS-приложения на примере синхронизации Яндекс.Ди...
 
Максим Ширшин — Регулярные выражения
Максим Ширшин — Регулярные выраженияМаксим Ширшин — Регулярные выражения
Максим Ширшин — Регулярные выражения
 
Semana Santa Torrejon 2015: Procesion del Encuentro en Domingo de Resurreccion
Semana Santa Torrejon 2015: Procesion del Encuentro en Domingo de ResurreccionSemana Santa Torrejon 2015: Procesion del Encuentro en Domingo de Resurreccion
Semana Santa Torrejon 2015: Procesion del Encuentro en Domingo de Resurreccion
 
Олег Мохов "CSS3 фарш"
Олег Мохов "CSS3 фарш"Олег Мохов "CSS3 фарш"
Олег Мохов "CSS3 фарш"
 
Ley cnbs
Ley cnbsLey cnbs
Ley cnbs
 
Apresentação leila exposiçao
Apresentação leila exposiçaoApresentação leila exposiçao
Apresentação leila exposiçao
 
Confecções Danifer - 10/09/2012
Confecções Danifer - 10/09/2012Confecções Danifer - 10/09/2012
Confecções Danifer - 10/09/2012
 

Plus de Yandex

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksYandex
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Yandex
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаYandex
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаYandex
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Yandex
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Yandex
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Yandex
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Yandex
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Yandex
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Yandex
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Yandex
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Yandex
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровYandex
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Yandex
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Yandex
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Yandex
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Yandex
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Yandex
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Yandex
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Yandex
 

Plus de Yandex (20)

Предсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of TanksПредсказание оттока игроков из World of Tanks
Предсказание оттока игроков из World of Tanks
 
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
Как принять/организовать работу по поисковой оптимизации сайта, Сергей Царик,...
 
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров ЯндексаСтруктурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
Структурированные данные, Юлия Тихоход, лекция в Школе вебмастеров Яндекса
 
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров ЯндексаПредставление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
Представление сайта в поиске, Сергей Лысенко, лекция в Школе вебмастеров Яндекса
 
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
Плохие методы продвижения сайта, Екатерины Гладких, лекция в Школе вебмастеро...
 
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
Основные принципы ранжирования, Сергей Царик и Антон Роменский, лекция в Школ...
 
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
Основные принципы индексирования сайта, Александр Смирнов, лекция в Школе веб...
 
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
Мобильное приложение: как и зачем, Александр Лукин, лекция в Школе вебмастеро...
 
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
Сайты на мобильных устройствах, Олег Ножичкин, лекция в Школе вебмастеров Янд...
 
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
Качественная аналитика сайта, Юрий Батиевский, лекция в Школе вебмастеров Янд...
 
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
Что можно и что нужно измерять на сайте, Петр Аброськин, лекция в Школе вебма...
 
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
Как правильно поставить ТЗ на создание сайта, Алексей Бородкин, лекция в Школ...
 
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеровКак защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
Как защитить свой сайт, Пётр Волков, лекция в Школе вебмастеров
 
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
Как правильно составить структуру сайта, Дмитрий Сатин, лекция в Школе вебмас...
 
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
Технические особенности создания сайта, Дмитрий Васильева, лекция в Школе веб...
 
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
Конструкторы для отдельных элементов сайта, Елена Першина, лекция в Школе веб...
 
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
Контент для интернет-магазинов, Катерина Ерошина, лекция в Школе вебмастеров ...
 
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
Как написать хороший текст для сайта, Катерина Ерошина, лекция в Школе вебмас...
 
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
Usability и дизайн - как не помешать пользователю, Алексей Иванов, лекция в Ш...
 
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
 

Алексей Патосин "Как можно доработать UITableViewController, чтобы облегчить себе жизнь"

  • 1. Yandex Mobile Camp Санкт-Петербург Как можно доработать UITableViewController чтобы облегчить себе жизнь Патосин Алексей YotaLab
  • 2. Agenda 1. Проблемы работы с таблицами под iOS 2. У нас есть решение 3. We need to go deeper 1
  • 3. Давайте поговорим о Cocoa таблицах
  • 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
  • 11. “smart” ячейка таблицы Хочется, чтобы ячейка стала самостоятельным элементом и знала: 10
  • 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
  • 15. Houston, we have a solution
  • 16. Структура таблицы Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean consectetuer. Abra Cadabra Caramba Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean consectetuer. 12
  • 17. Структура таблицы section Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean consectetuer. Abra Cadabra Caramba Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean consectetuer. 12
  • 18. Структура таблицы section Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean consectetuer. Abra Cadabra Caramba Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean consectetuer. 12
  • 19. Структура таблицы section Lorem ipsum dolor sit amet, consectetuer cells adipiscing elit. Aenean consectetuer. Abra Cadabra Caramba Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean consectetuer. 12
  • 20. Структура таблицы section Lorem ipsum dolor sit amet, consectetuer cells adipiscing elit. Aenean consectetuer. Abra headerTitle Cadabra headerView Caramba headerHeight Lorem ipsum dolor sit amet, consectetuer footerTitle adipiscing elit. Aenean consectetuer. footerView footerHeight 12
  • 21. Структура таблицы section Lorem ipsum dolor sit amet, consectetuer cells adipiscing elit. Aenean consectetuer. Abra headerTitle Cadabra headerView Caramba headerHeight Lorem ipsum dolor sit amet, consectetuer footerTitle adipiscing elit. Aenean consectetuer. footerView footerHeight 12
  • 22. Структура таблицы section Lorem ipsum dolor sit amet, consectetuer cells cellActions adipiscing elit. Aenean consectetuer. Abra headerTitle Cadabra headerView Caramba headerHeight Lorem ipsum dolor sit amet, consectetuer footerTitle adipiscing elit. Aenean consectetuer. footerView footerHeight 12
  • 24. Мы выделили следующие типы ячеек – Push Добавить поле – State - Switch Показывать всегда - Check 10 мин – Edit Email steve@apple.com - Flexible edit Телефон +7(800)123-666-7 – Text Сейчас онлайн 12/32 13
  • 25. SmartTableViewController UITableViewController UITableViewControllerDelegate UITableViewControllerDataSource SmartTableViewController UITableViewCell TableSectionContainer AbstractSmartTableViewCell PushTableViewCell TextTableViewCell EditTableViewCell AbstractStateTableViewCell FlexibleEditTableViewCell SwitchTableViewCell CheckTableViewCell 14
  • 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
  • 29. Как заполнять структуру таблицы - (void)updateSections{     [super updateSections];          [sections addObject:[self pilotSection]];     [sections addObject:[self jetSection]];     [sections addObject:[self weaponSection]];           [self.tableView reloadData]; } 18
  • 30. Как заполнять структуру таблицы - (void)updateSections{     [super updateSections];          [sections addObject:[self pilotSection]];     [sections addObject:[self jetSection]];     [sections addObject:[self weaponSection]];           [self.tableView reloadData]; } 18
  • 31. Как заполнять структуру таблицы - (void)updateSections{     [super updateSections];          [sections addObject:[self pilotSection]];     [sections addObject:[self jetSection]];     [sections addObject:[self weaponSection]];           [self.tableView reloadData]; } 18
  • 32. Как заполнять структуру таблицы - (void)updateSections{     [super updateSections];          [sections addObject:[self pilotSection]];     [sections addObject:[self jetSection]];     [sections addObject:[self weaponSection]];           [self.tableView reloadData]; } 18
  • 33. Как создавать секции - (TableSectionContainer *)pilotSection{     TableSectionContainer *section = [TableSectionContainer sectionWithSectionId:pilotSectionId];          section.headerTitle = @"Pilot";              [section.cells addObject:[self pilotCell]];          [section setFooterTitle:@"pilot name and range are required"];     [section setFooterHeight:20];                return section; } 19
  • 34. Как создавать секции - (TableSectionContainer *)pilotSection{     TableSectionContainer *section = [TableSectionContainer sectionWithSectionId:pilotSectionId];          section.headerTitle = @"Pilot";              [section.cells addObject:[self pilotCell]];          [section setFooterTitle:@"pilot name and range are required"];     [section setFooterHeight:20];                return section; } 19
  • 35. Как создавать секции - (TableSectionContainer *)pilotSection{     TableSectionContainer *section = [TableSectionContainer sectionWithSectionId:pilotSectionId];          section.headerTitle = @"Pilot";              [section.cells addObject:[self pilotCell]];          [section setFooterTitle:@"pilot name and range are required"];     [section setFooterHeight:20];                return section; } 19
  • 36. Как создавать секции - (TableSectionContainer *)pilotSection{     TableSectionContainer *section = [TableSectionContainer sectionWithSectionId:pilotSectionId];          section.headerTitle = @"Pilot";              [section.cells addObject:[self pilotCell]];          [section setFooterTitle:@"pilot name and range are required"];     [section setFooterHeight:20];                return section; } 19
  • 37. Как создавать секции - (TableSectionContainer *)pilotSection{     TableSectionContainer *section = [TableSectionContainer sectionWithSectionId:pilotSectionId];          section.headerTitle = @"Pilot";              [section.cells addObject:[self pilotCell]];          [section setFooterTitle:@"pilot name and range are required"];     [section setFooterHeight:20];                return section; } 19
  • 38. Как создавать ячейки - (PushTableViewCell *)pilotCell{     PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];          __block typeof(self) bself = self;          [cell setCalledBlock:^{         [bself showPilotViewController];     }];          [self addNotificationObserver:@"PilotNameChanged" object:_jet.pilot  usingBlock: ^(NSNotification *notification){   cell.textLabel.text = [NSString  stringWithFormat:@"%@ %@", bself.jet.pilot.pilotName, [bself.jet.pilot pilotRangeDescription]];       } calledBlockImmediately:YES];          return cell; } 20
  • 39. Как создавать ячейки - (PushTableViewCell *)pilotCell{     PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];          __block typeof(self) bself = self;          [cell setCalledBlock:^{         [bself showPilotViewController];     }];          [self addNotificationObserver:@"PilotNameChanged" object:_jet.pilot  usingBlock: ^(NSNotification *notification){   cell.textLabel.text = [NSString  stringWithFormat:@"%@ %@", bself.jet.pilot.pilotName, [bself.jet.pilot pilotRangeDescription]];       } calledBlockImmediately:YES];          return cell; } 20
  • 40. Как создавать ячейки - (PushTableViewCell *)pilotCell{     PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];          __block typeof(self) bself = self;          [cell setCalledBlock:^{         [bself showPilotViewController];     }];          [self addNotificationObserver:@"PilotNameChanged" object:_jet.pilot  usingBlock: ^(NSNotification *notification){   cell.textLabel.text = [NSString  stringWithFormat:@"%@ %@", bself.jet.pilot.pilotName, [bself.jet.pilot pilotRangeDescription]];       } calledBlockImmediately:YES];          return cell; } 20
  • 41. Как создавать ячейки - (PushTableViewCell *)pilotCell{     PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];          __block typeof(self) bself = self;          [cell setCalledBlock:^{         [bself showPilotViewController];     }];          [self addNotificationObserver:@"PilotNameChanged" object:_jet.pilot  usingBlock: ^(NSNotification *notification){   cell.textLabel.text = [NSString  stringWithFormat:@"%@ %@", bself.jet.pilot.pilotName, [bself.jet.pilot pilotRangeDescription]];       } calledBlockImmediately:YES];          return cell; } 20
  • 42. Как создавать ячейки - (PushTableViewCell *)pilotCell{     PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];          __block typeof(self) bself = self;          [cell setCalledBlock:^{         [bself showPilotViewController];     }];          [self addNotificationObserver:@"PilotNameChanged" object:_jet.pilot  usingBlock: ^(NSNotification *notification){   cell.textLabel.text = [NSString  stringWithFormat:@"%@ %@", bself.jet.pilot.pilotName, [bself.jet.pilot pilotRangeDescription]];       } calledBlockImmediately:YES];          return cell; } 20
  • 43. Как создавать ячейки - (PushTableViewCell *)pilotCell{     PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];          __block typeof(self) bself = self;          [cell setCalledBlock:^{         [bself showPilotViewController];     }];          [self addNotificationObserver:@"PilotNameChanged" object:_jet.pilot  usingBlock: ^(NSNotification *notification){   cell.textLabel.text = [NSString  stringWithFormat:@"%@ %@", bself.jet.pilot.pilotName, [bself.jet.pilot pilotRangeDescription]];       } calledBlockImmediately:YES];          return cell; } 20
  • 44. Как создавать ячейки - (PushTableViewCell *)pilotCell{     PushTableViewCell *cell = [PushTableViewCell cellWithCellId:pilotCellId];          __block typeof(self) bself = self;          [cell setCalledBlock:^{         [bself showPilotViewController];     }];          [self addNotificationObserver:@"PilotNameChanged" object:_jet.pilot  usingBlock: ^(NSNotification *notification){   cell.textLabel.text = [NSString  stringWithFormat:@"%@ %@", bself.jet.pilot.pilotName, [bself.jet.pilot pilotRangeDescription]];       } calledBlockImmediately:YES];          return cell; } 20
  • 45. Некоторые нюансы специфичных ячеек StateTableViewCell и её потомки Check и Switch [cell setCalledBlock:^{      bself.jet.isOn = ! bself.jet.isOn;  }]; 21
  • 46. Некоторые нюансы специфичных ячеек EditTableViewCell     [cell setCalledBlock:^{         bself.jet.pilotName = cell.valueTextField.text;          }]; 22
  • 47. Некоторые нюансы специфичных ячеек FlexibleEditTableViewCell typedef void(^CalledBlock)(void); typedef BOOL(^ShouldChangeCharactersInRange)(NSRange range, NSString *string); typedef BOOL(^TextFieldShouldReturnBlock)(void); typedef BOOL(^TextFieldShouldClearBlock)(void); ShouldChangeCharactersInRange _shouldChangeCharactersInRangeBlock; TextFieldShouldReturnBlock _textFieldShouldReturnBlock; TextFieldShouldClearBlock _textFieldShouldClearBlock; CalledBlock _textFieldDidBeginEditingBlock; CalledBlock _textFieldDidEndEditingBlock; 23
  • 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