Требования к операционной системе: 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 секунд после запуска примера будет восстановлено первоначальное состояние регламентного отчета:

См. также: