SlideShare una empresa de Scribd logo
1 de 51
Descargar para leer sin conexión
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

Más contenido relacionado

Destacado

Мария Кудряшова "Наши «яблоки Ньютона», или реальные инсайты из жизни Яндекс....
Мария Кудряшова "Наши «яблоки Ньютона», или реальные инсайты из жизни Яндекс....Мария Кудряшова "Наши «яблоки Ньютона», или реальные инсайты из жизни Яндекс....
Мария Кудряшова "Наши «яблоки Ньютона», или реальные инсайты из жизни Яндекс....Yandex
 
Где прячутся мобильные вирусы — Григорий Земсков
Где прячутся мобильные вирусы — Григорий ЗемсковГде прячутся мобильные вирусы — Григорий Земсков
Где прячутся мобильные вирусы — Григорий ЗемсковYandex
 
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"Yandex
 
Alexander Ignatyev "MapReduce infrastructure"
Alexander Ignatyev "MapReduce infrastructure"Alexander Ignatyev "MapReduce infrastructure"
Alexander Ignatyev "MapReduce infrastructure"Yandex
 
Антон Кортунов "Elliptics в Яндексе"
Антон Кортунов "Elliptics в Яндексе"Антон Кортунов "Elliptics в Яндексе"
Антон Кортунов "Elliptics в Яндексе"Yandex
 
Андрей Себрант - открытие конференции
Андрей Себрант - открытие конференции  Андрей Себрант - открытие конференции
Андрей Себрант - открытие конференции Yandex
 
Сильвио Микали «Универсальная система платежей»
Сильвио Микали «Универсальная система платежей» Сильвио Микали «Универсальная система платежей»
Сильвио Микали «Универсальная система платежей» Yandex
 
Ксения Покровская "Проблемы доставки iOS-приложений на тестовые устройства
Ксения Покровская "Проблемы доставки iOS-приложений на тестовые устройстваКсения Покровская "Проблемы доставки iOS-приложений на тестовые устройства
Ксения Покровская "Проблемы доставки iOS-приложений на тестовые устройстваYandex
 
Влад Алексеев "Как начать разработку под iOS"
Влад Алексеев "Как начать разработку под iOS"Влад Алексеев "Как начать разработку под iOS"
Влад Алексеев "Как начать разработку под iOS"Yandex
 
JavaScript Hackathon for Students
JavaScript Hackathon for StudentsJavaScript Hackathon for Students
JavaScript Hackathon for StudentsTakumi Ohashi
 
Lugares históricos de China, Luis Velasquez
Lugares históricos de China, Luis VelasquezLugares históricos de China, Luis Velasquez
Lugares históricos de China, Luis VelasquezLuis Velasquez
 
O antigo egipto
O antigo egiptoO antigo egipto
O antigo egiptoceufaias
 
Tics en educacion_infantil
Tics en educacion_infantilTics en educacion_infantil
Tics en educacion_infantiljavilopez44
 
Una Pasion, Un Sentimiento "IL VOLO"
Una Pasion, Un Sentimiento "IL VOLO"Una Pasion, Un Sentimiento "IL VOLO"
Una Pasion, Un Sentimiento "IL VOLO"Gaby Cáceres
 
In mobi ppt
In mobi ppt  In mobi ppt
In mobi ppt shel10
 

Destacado (20)

Мария Кудряшова "Наши «яблоки Ньютона», или реальные инсайты из жизни Яндекс....
Мария Кудряшова "Наши «яблоки Ньютона», или реальные инсайты из жизни Яндекс....Мария Кудряшова "Наши «яблоки Ньютона», или реальные инсайты из жизни Яндекс....
Мария Кудряшова "Наши «яблоки Ньютона», или реальные инсайты из жизни Яндекс....
 
Где прячутся мобильные вирусы — Григорий Земсков
Где прячутся мобильные вирусы — Григорий ЗемсковГде прячутся мобильные вирусы — Григорий Земсков
Где прячутся мобильные вирусы — Григорий Земсков
 
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"
Олег Мохов "Куда движется вёрстка и верстальщики Яндекса"
 
Alexander Ignatyev "MapReduce infrastructure"
Alexander Ignatyev "MapReduce infrastructure"Alexander Ignatyev "MapReduce infrastructure"
Alexander Ignatyev "MapReduce infrastructure"
 
Антон Кортунов "Elliptics в Яндексе"
Антон Кортунов "Elliptics в Яндексе"Антон Кортунов "Elliptics в Яндексе"
Антон Кортунов "Elliptics в Яндексе"
 
Андрей Себрант - открытие конференции
Андрей Себрант - открытие конференции  Андрей Себрант - открытие конференции
Андрей Себрант - открытие конференции
 
Сильвио Микали «Универсальная система платежей»
Сильвио Микали «Универсальная система платежей» Сильвио Микали «Универсальная система платежей»
Сильвио Микали «Универсальная система платежей»
 
Ксения Покровская "Проблемы доставки iOS-приложений на тестовые устройства
Ксения Покровская "Проблемы доставки iOS-приложений на тестовые устройстваКсения Покровская "Проблемы доставки iOS-приложений на тестовые устройства
Ксения Покровская "Проблемы доставки iOS-приложений на тестовые устройства
 
Влад Алексеев "Как начать разработку под iOS"
Влад Алексеев "Как начать разработку под iOS"Влад Алексеев "Как начать разработку под iOS"
Влад Алексеев "Как начать разработку под iOS"
 
Aula 06 / Monitoramento: Ferramentas de Gestão
Aula 06 / Monitoramento: Ferramentas de GestãoAula 06 / Monitoramento: Ferramentas de Gestão
Aula 06 / Monitoramento: Ferramentas de Gestão
 
JavaScript Hackathon for Students
JavaScript Hackathon for StudentsJavaScript Hackathon for Students
JavaScript Hackathon for Students
 
Lugares históricos de China, Luis Velasquez
Lugares históricos de China, Luis VelasquezLugares históricos de China, Luis Velasquez
Lugares históricos de China, Luis Velasquez
 
Server
ServerServer
Server
 
Ata
AtaAta
Ata
 
Tribus urbanas
Tribus urbanas Tribus urbanas
Tribus urbanas
 
O antigo egipto
O antigo egiptoO antigo egipto
O antigo egipto
 
Tics en educacion_infantil
Tics en educacion_infantilTics en educacion_infantil
Tics en educacion_infantil
 
Tarea parques
Tarea parquesTarea parques
Tarea parques
 
Una Pasion, Un Sentimiento "IL VOLO"
Una Pasion, Un Sentimiento "IL VOLO"Una Pasion, Un Sentimiento "IL VOLO"
Una Pasion, Un Sentimiento "IL VOLO"
 
In mobi ppt
In mobi ppt  In mobi ppt
In mobi ppt
 

Más 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
 

Más 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