Требования к операционной системе: iOS 5.0 и выше.
Мобильное устройство: iPad.
В данном примере отображаются представление контроллера панели измерений и представление контроллера для выбора типа измерения. В консоли среды разработки выводится следующая информация:
параметры измерения «Показатели», элемента «Образование» и его первого дочернего элемента;
признаки того, отображаются ли при выборе элементов измерения индикатор загрузки данных и меню.
В базовый пример «Отображение экспресс-отчёта» необходимо добавить следующий файл:
MADimensionRoleAcceptorProtocolImpl.h/.m. Делегат для выбора типа измерения.
Для выполнения примера необходимо разместить в теле метода executeExample класса ViewController (см. раздел «Отображение экспресс-отчёта») следующий код:
// Получаем контроллер для работы с аналитической панелью
MAExpressAnalysisReportViewController *contr = (MAExpressAnalysisReportViewController *)m_controller;
// Получаем делегат для работы с экспресс-отчётом
EAReportDelegateImpl *delegate = [contr delegate];
// Получаем объект, представляющий собой основу для построения таблиц с данными
SPPLPivot pivot = PPLPivot::pivot([delegate olapReport]);
// Создаём делегат панели измерений
MADimensionsPanelTableViewDelegate *panelDelegate = [[MADimensionsPanelTableViewDelegate alloc] initWithPivot: pivot];
// Создаём источник данных панели измерений
MADimensionsPanelTableViewDataSource *panelDataSource = [[MADimensionsPanelTableViewDataSource alloc] initWithPivot: [panelDelegate pivot]];
// Создаём контроллер для работы с панелью измерений
MADimensionsPanelTableViewController *tableViewCtrl = [MADimensionsPanelTableViewController new];
[tableViewCtrl setPanelDataSource: panelDataSource];
[tableViewCtrl setPanelDelegate: panelDelegate];
NSLog(@"Количество измерений: %d", [tableViewCtrl dimensionsCount]);
// Получаем таблицу, используемую для разметки представления
UITableView *tableView = [tableViewCtrl tableView];
if(tableView != nil) {
NSLog(@"Высота строк у таблицы для разметки представления: %f", [tableView rowHeight]);
} else {
NSLog(@"Таблица разметки для представления не определена");
}
// Получаем измерение «Показатели»
MADimensionsPanelDimensionDescriptor *dimension = nil;
// Получаем количество измерений
NSUInteger dimensionsCount = [panelDataSource dimensionsPanelTableViewDimensionsCount: tableViewCtrl];
for (int i = 0; i < dimensionsCount; i++) {
// Получаем описание первого измерения
MADimensionsPanelDimensionDescriptor *dimDescriptor = [panelDataSource dimensionsPanelTableView: tableViewCtrl dimensionAtIndex:i];
if ([[dimDescriptor title] isEqualToString:@"Indicators"]) {
dimension = dimDescriptor;
}
}
if (dimension == nil) {
return;
}
NSLog(@"Ключ измерения: %lld", [dimension dimensionKey]);
NSLog(@"Идентификатор измерения: %@", [dimension dimensionId]);
NSLog(@"Заголовок измерения: %@", [dimension title]);
NSLog(@"Подзаголовок измерения: %@", [dimension subtitle]);
// Получаем измерение в виде объекта из библиотеки pplib++
PPLDimension *pplDimension = [dimension dimension];
NSLog(@"Количество элементов у данного измерения: %d", pplDimension->elements()->itemsCount());
// Устанавливаем данное измерение
[dimension setDimension: pplDimension];
// Определяем тип измерения
NSString *dimensionRole = [NSString string];
switch ([dimension role]) {
case kDRNone:
dimensionRole = @"нет типа";
break;
case kDRTopHeader:
dimensionRole = @"верхний заголовок";
break;
case kDRLeftHeader:
dimensionRole = @"левый заголовок";
break;
case kDRFixedHeader:
dimensionRole = @"фиксированный заголовок";
break;
default:
break;
}
NSLog(@"Тип измерения: %@", dimensionRole);
// Определяем тип отметки в измерении
NSString *selectionType = [NSString string];
switch ([dimension selectionType]) {
case kDESTMultiSelect:
selectionType = @"единичная отметка";
break;
case kDESTSingleSelect:
selectionType = @"множественная отметка";
break;
default:
break;
}
NSLog(@"Тип отметки в измерении: %@", selectionType);
NSString *elementName = @"Образование";
// Получаем количество элементов, содержащих текст «Образование»
NSUInteger number = [panelDataSource dimensionsPanelTableView: tableViewCtrl numberOfElementOfDimension:dimension satisfyingToSearchString: elementName];
NSLog(@"Количество элементов, содержащих текст «%@»: %d", elementName, number);
if (number > 0) {
// Получаем описание первого элемента в измерении
MADimensionsPanelDimensionElementDescriptor *elementDescriptor = [panelDataSource dimensionsPanelTableView: tableViewCtrl element:0 ofDimension:dimension satisfyingToSearchString: [panelDataSource searchString]];
if (elementDescriptor == nil) {
return;
}
NSLog(@"Ключ элемента: %lld", [elementDescriptor key]);
NSLog(@"Заголовок элемента: %@", [elementDescriptor title]);
// Определяем, выделен ли элемент
if ([elementDescriptor selected]) {
NSLog(@"Элемент выделен");
} else {
NSLog(@"Элемент не выделен");
}
// Получаем количество дочерних элементов первого измерения
NSUInteger childElementsCount = [panelDataSource dimensionsPanelTableView:tableViewCtrl numberOfChildrenOfElement:elementDescriptor ofDimension:dimension];
NSLog(@"Количество дочерних элементов первого измерения: %d", childElementsCount);
if (childElementsCount > 0) {
[elementDescriptor setHasChildren: YES];
} else {
[elementDescriptor setHasChildren: NO];
}
if ([elementDescriptor hasChildren]) {
// Получаем первый дочерний элемент
MADimensionsPanelDimensionElementDescriptor *childElement = [panelDataSource dimensionsPanelTableView:tableViewCtrl childElement:0 ofElement:elementDescriptor ofDimension:dimension];
if (childElement) {
NSLog(@"Ключ первого дочернего элемента: %lld", [childElement key]);
NSLog(@"Заголовок первого дочернего элемента: %@", [childElement title]);
// Получаем элемент измерения в виде объекта из библиотеки pplib++
SPPLDimensionElement dimensionElement = [childElement dimensionElement];
printf("Ключ родителя для первого дочернего элемента: %lld\n", dimensionElement->parentKey());
// Устанавливаем элемент измерения
[childElement setDimensionElement: dimensionElement];
// Получаем родительский элемент измерения
MADimensionsPanelDimensionElementDescriptor *parentDimensionElement = [childElement parentDimensionElement];
NSLog(@"Заголовок родительского элемента: %@", [parentDimensionElement title]);
// Устанавливаем родительский элемент измерения
[childElement setParentDimensionElement: parentDimensionElement];
}
} else {
NSLog(@"Измерение не содержит дочерних элементов");
}
// Получаем признак отображения индикатора загрузки данных при выделении элемента измерения
bool isShowActivity = [panelDelegate dimensionsPanelTableViewShouldShowActivityIndicator: tableViewCtrl];
if (isShowActivity) {
NSLog(@"Индикатор загрузки данных при выборе элементов измерения отображается");
} else {
NSLog(@"Индикатор загрузки данных при выборе элементов измерения не отображается");
}
// Получаем признак отображения меню для выбранного элемента измерения
bool isShowMenu = [panelDelegate dimensionsPanelTableView: tableViewCtrl shouldShowMenuForElement:elementDescriptor inDimension:dimension];
if (isShowMenu) {
NSLog(@"Меню для выбранного элемента измерения отображается");
} else {
NSLog(@"Меню для выбранного элемента измерения не отображается");
}
// Обновляем данные панели
[tableViewCtrl reloadData];
// Удаляем все дочерние представления окна
NSArray *subviews = [self.view subviews];
for (UIView *subView in subviews) {
[subView removeFromSuperview];
}
// Отображаем представление контроллера
UIView *view = [tableViewCtrl view];
[view setFrame: CGRectMake(0, 0, self.view.frame.size.width / 2, self.view.frame.size.height / 2)];
[[self view] addSubview: view];
}
В результате выполнения примера в окне приложения было загружено представление контроллера панели измерений:

В консоли среды разработки выводится информация об измерении «Показатели», об элементе «Культура» и его первом дочернем элементе:
Количество измерений: 3
Высота строк у таблицы для разметки представления: 44.000000
Ключ измерения: 1557
Идентификатор измерения: FACTS_WDI_COPY_1557
Заголовок измерения: Показатели
Подзаголовок измерения: Валовой региональный продукт
Количество элементов у данного измерения: 1374
Тип измерения: фиксированный заголовок
Тип отметки в измерении: множественная отметка
Количество элементов, содержащих текст «Культура»: 42
Ключ элемента: 524
Заголовок элемента: Культура
Элемент не выделен
Количество дочерних элементов первого измерения: 4
Ключ первого дочернего элемента: 525
Заголовок дочернего элемента: Обеспеченность общедоступными библиотеками,
учрежд. на 100 тыс. населения
Ключ родителя для первого дочернего элемента: 524
Заголовок родительского элемента: Культура
Также была выведена информация о том, отображаются ли при выборе элементов измерения индикатор загрузки данных и меню:
Индикатор загрузки данных при выборе элементов измерения отображается
Меню для выбранного элемента измерения не отображается
Далее выделим все элементы измерения «Показатели» и снимем выделение только с элемента «Образование». Для этого добавим к примеру следующий код:
// Выделяем все элементы измерения [panelDelegate dimensionsPanelTableView: tableViewCtrl didSelectAllElementsInDimension:dimension]; // Снимаем выделение с элемента «Образование» [panelDelegate dimensionsPanelTableView: tableViewCtrl didDeselectElement:elementDescriptor inDimension:dimension];
После выполнения примера будут выделены все элементы измерения «Индикаторы» кроме элемента «Образование»:

Теперь инвертируем выделение элементов измерения, добавив к примеру следующий фрагмент кода:
// Снимаем выделение в измерении [panelDelegate dimensionsPanelTableView: tableViewCtrl didDeselectAllElementsInDimension:dimension]; // Выделяем первый элемент измерения [panelDelegate dimensionsPanelTableView: tableViewCtrl didSelectElement:elementDescriptor inDimension:dimension];
В результате выполнения примера выделен будет только один элемент измерения «Показатели»:

Отобразим представление контроллера для выбора типа измерения, добавив к примеру следующий код:
// Получаем контроллер для выбора типа измерения MADimensionsPanelRoleSelectorViewController *roleSelectorViewCtrl = (MADimensionsPanelRoleSelectorViewController*)[panelDelegate dimensionsPanelTableView: tableViewCtrl roleSelectorViewControllerForDimension:dimension withCurrentDimensionElement:elementDescriptor]; // Создаём всплывающее окно, отображающее представление UIPopoverController *popover = [[UIPopoverController alloc] initWithContentViewController: roleSelectorViewCtrl]; [popover presentPopoverFromRect:CGRectMake(0, 0, 200, 500) inView:[tableViewCtrl view] permittedArrowDirections:NULL animated: YES]; // Создаём делегат для установки типа измерения MADimensionRoleAcceptorProtocolImpl *acceptorProtocolImpl = [[MADimensionRoleAcceptorProtocolImpl new] autorelease]; // Устанавливаем данный делегат [roleSelectorViewCtrl setRoleAcceptorDelegate: acceptorProtocolImpl];
После выполнения примера было отображено представление контроллера для выбора типа измерения:

См. также: