Работа с представлением данных в виде таблицы (пример 2)

Требования к операционной системе: iOS 5.0 и выше.

Мобильное устройство: iPad.

Описание

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

Также в консоль среды разработки выводится следующая информация:

Исходный код

Для выполнения примера необходимо разместить взамен метода executeExample класса ViewController (см. раздел «Отображение экспресс-отчёта») следующий код:

// Выполняем пользовательский пример
-(void) executeExample {
    // Получаем контроллер представления отчета
    MAExpressAnalysisReportViewController *contr = (MAExpressAnalysisReportViewController*)m_controller;
    // Отображаем таблицу
    if([[contr delegate] mode] != kViewModeTable)
        [contr setDataViewMode:kViewModeTable];
    // Получаем текущий контроллер
    MAGridDataViewController *activeController = (MAGridDataViewController *)[contr activeDataViewController];
    // Извещаем делегат о завершении обработки действий пользователя
    if(![activeController isAvailable]){
        [[activeController delegate] dataViewController:activeController availabilityUpdated:YES];
    }
    // Получаем представление контроллера
    UIView *view = [activeController view];
    // Получаем массив вложенных представлений
    NSArray *subviews = [view subviews];
    // Перебираем в цикле вложенные представления
    for(NSObject *subview in subviews)
    {
        // Проверяем, является ли текущее представление табличным представлением
        if([subview isMemberOfClass:[NuGridView class]])
        {
            // Получаем объект табличного представления
            NuGridView *gView = (NuGridView *)subview;
            // Выделяем ячейки таблицы
            [[gView controller] selectAreaFromRow:[gView rowWithNumber:0] column:[gView columnWithNumber:0] toRow:[gView rowWithNumber:1] column:[gView columnWithNumber:1]];
            // Обновляем таблицу
            [activeController updateDataWithGridSelection];
        }
    }
    // Проверяем наличие информации о состоянии представления
    NSData *state = [[activeController delegate] stateForDataViewController:activeController];
    if (state != nil){
        GridDataViewDatasource *ds1 = [activeController gridDatasource];
        // Загружаем настройки представления
        [activeController loadState];
        GridDataViewDatasource *ds2 = [activeController gridDatasource];
        // Если изменился источник данных, извещаем контроллер о смене отметки источника
        if(ds1 != ds2){
            [[activeController delegate] dataViewControllerChangedSelection:activeController];
        }
        // Перезагружаем данные
        [activeController reloadData];
        // Сохраняем состояние
        [[activeController delegate] setState:state forDataViewController:activeController];
    }
    else{
        // Сохраняем состояние представления
        [activeController saveState];
        NSLog(@"Размер данных состояния представления: %i байт", [[[contr delegate] gridState] length]);
    }
    // Генерируем содержимое контроллера представления в виде PDF и выводим его размер
    if(![activeController isDoingCalculations]){
        if([activeController canGeneratePDFContent]){
            [activeController generatePDFWithCompletionBlock:^(NSData * data) {
                NSLog(@"Размер содержимого контроллера представления в виде PDF: %i байт", [data length]);
            }];
        }
    }
    // Устанавливаем массив кнопок действий над контроллером
    NSArray *buttons = [activeController barButtonItems];
    if((buttons != nil) && ([buttons count] > 1)){
        NSMutableArray *arr = [NSMutableArray arrayWithObject:buttons[0]];
        [[activeController delegate] setBarButtonItems:arr forDataViewController:activeController];
    }
    // Выводим размер скриншота содержимого контроллера
    [[activeController delegate] dataViewControllerReadyForScreenshot:activeController];
    CGSize s = [[activeController  screenshot] size];
    NSLog(@"Размер скриншота содержимого контроллера: (%f x %f)", s.width, s.height);
    // Выводим информацию о контроллере представления
    NSLog(@"Признак наличия элементов управления представлением: %hhd", [activeController hasControls]);
    [[activeController delegate] dataViewControllerReloadTitle:activeController];
    if([activeController isDataViewTitleVisible])
        NSLog(@"Заголовок представления: %@",  [activeController dataViewTitle]);
    NSLog(@"Заголовок контроллера представления: %@", [activeController title]);
    NSLog(@"Значение тэга представления: %i", [activeController tag]);
    NSDictionary *config = [[activeController delegate] configurationForDataViewController:activeController];
    NSLog(@"Количество настроек контроллера: %i", [config count]);
    // Отображаем индикатор загрузки
    [[activeController delegate] dataViewControllerWillStartCalculations:activeController];
    // Отображаем панель настроек представления
    if([activeController isAvailable] && [activeController hasAppeared]){
        if([activeController hasSettingsController]){
            [[activeController delegate] dataViewController:activeController showSettingsController:[activeController settingsController] fromView:[activeController view]];
        }
    }
    // Запускаем таймер на 3 секунды
    [NSTimer scheduledTimerWithTimeInterval:3.0f target:self selector:@selector(timerEvent) userInfo:nil repeats:NO];
}
// Обрабатываем событие таймера
- (void) timerEvent{
    // Получаем контроллер представления отчета
    MAExpressAnalysisReportViewController *contr = (MAExpressAnalysisReportViewController*)m_controller;
    // Получаем текущее представление
    id<MADataViewControllerProtocol> activeController = [contr activeDataViewController];
    // Скрываем панель настроек контроллера
    [[activeController delegate] dataViewControllerHideSettings:activeController];
    // Скрываем индикатор загрузки
    [[activeController delegate] dataViewControllerDidFinishCalculations:activeController];
}

В результате выполнения примера будут отображены панель настроек представления и индикатор загрузки:

Также в консоль среды разработки будет выведена информация о контроллере текущего представления:

Размер данных состояния представления: 17707 байт

Размер скриншота содержимого контроллера: (444.000000 x 980.000000)

Признак наличия элементов управления представлением: 1

Заголовок контроллера представления: Таблица

Значение тэга представления: 0

Количество настроек контроллера: 1

Размер содержимого контроллера представления в виде PDF: 2748895 байт

Через три секунды после выполнения примера панель настроек представления и индикатор загрузки будут скрыты:

См. также:

Примеры использования компонентов