Работа с делегатом регламентного отчета

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

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

Описание

В данном примере описываются некоторые приемы работы с делегатом регламентного отчета. После запуска примера выполняются следующие операции:

Исходный код

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

// Получаем представление регламентного отчета
MAProceduralReportViewController *proceduralReportController = (MAProceduralReportViewController *)m_controller;
// Получаем делегат регламентного отчета
id<MAProceduralReportViewControllerDelegate> delegate = [proceduralReportController delegate];
// Выводим в консоль среды разработки заголовок регламентного отчета
if ([delegate respondsToSelector:@selector(reportTitle)]) {
    NSLog(@"Заголовок регламентного отчета: %@",[delegate reportTitle]);
} else {
    NSLog(@"Заголовок регламентного отчета не определён");
}
// Получаем массив представлений в регламентном отчете
NSArray *dataViewControllers = [proceduralReportController dataViewControllers];
// Перебираем в цикле представления регламентного отчета
for(UIViewController *controller in dataViewControllers)
{
    // Проверяем, является ли текущее представление просмотрщиком листов регламентного отчета
    if([controller isMemberOfClass:[MAProceduralReportDataViewController class]])
    {
        // Получаем представление просмотрщика листов
        MAProceduralReportDataViewController *dataViewController =(MAProceduralReportDataViewController *)controller;
        // Получаем представление просмотрщика регламентных отчетов
        MAProceduralReportDataViewControllerBase *base = (MAProceduralReportDataViewControllerBase *)dataViewController;
        // Получаем отображение документа
        UIWebView *pdfView = [base pdfView];
        // Получаем границы документа
        CGRect frame = [pdfView frame];
        // Сохраняем координаты левого верхнего угла границы документа в делегате в виде массива байт
        NSNumber *frameOriginX = [NSNumber numberWithInt:frame.origin.x];
        NSNumber *frameOriginY = [NSNumber numberWithInt:frame.origin.y];
        NSMutableDictionary *stateData = [NSMutableDictionary dictionary];
        [stateData setObject:frameOriginX forKey:@"frame.origin.x"];
        [stateData setObject:frameOriginY forKey:@"frame.origin.y"];
        NSData *data = [NSKeyedArchiver archivedDataWithRootObject:stateData];
        [delegate setState:data];
        // Устанавливаем новые значения координат левого верхнего угла границы документа
        frame.origin.x = frame.origin.x + 30;
        frame.origin.y = frame.origin.y + 30;
        // Обновляем расположение регламентного отчета
        [base updateViewWithFrame:frame];
        // Восстанавливаем первоначальное расположение регламентного отчета после паузы
        [self performSelector:@selector(restoreSettings:) withObject:[delegate state] afterDelay:5];
    }
}

Также необходимо в классе ViewController добавить следующий метод вместе с его реализацией:

// Восстанавливает сохраненное состояние регламентного отчета
- (void) restoreSettings:(NSData *)data
{
    // Получаем представление регламентного отчета
    MAProceduralReportViewController *proceduralReportController = (MAProceduralReportViewController *)m_controller;
    // Получаем массив представлений в регламентном отчете
    NSArray *dataViewControllers = [proceduralReportController dataViewControllers];
    // Перебираем в цикле представления регламентного отчета
    for( UIViewController *controller in dataViewControllers)
    {
        // Проверяем, является ли текущее представление просмотрщиком листов регламентного отчета
        if([controller isMemberOfClass:[MAProceduralReportDataViewController class]]) {
            // Получаем представление просмотрщика листов
            MAProceduralReportDataViewController *dataViewController =(MAProceduralReportDataViewController *)controller;
            // Получаем представление просмотрщика регламентных отчетов
            MAProceduralReportDataViewControllerBase *base = (MAProceduralReportDataViewControllerBase *)dataViewController;
            // Получаем отображение документа
            UIWebView *pdfView = [base pdfView];
            // Получаем границы документа
            CGRect frame = [pdfView frame];
            // Извлекаем настройки регламентного отчета
            NSDictionary *dataState = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)data];
            // Задаем координаты левого верхнего угла рамки регламентного отчета
            NSNumber *frameOriginX = [dataState valueForKey:@"frame.origin.x"];
            NSNumber *frameOriginY = [dataState valueForKey:@"frame.origin.y"];
            frame.origin.x = [frameOriginX intValue];
            frame.origin.y = [frameOriginY intValue];
            // Обновляем расположение регламентного отчета
            [base updateViewWithFrame:frame];
        }
    }
}

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

Заголовок регламентного отчета: Procedural report

 

Также на экране мобильного устройства будет отображен регламентный отчет, для которого заданы новые значения координат левого верхнего угла границы документа:

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

См. также:

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