Требования к операционной системе: iOS 5.0 и выше.
Мобильное устройство: iPad.
В данном примере описываются некоторые приемы работы с источником данных таблицы. После запуска примера выполняются следующие операции:
создается и извлекается источник данных таблицы;
извлекается объект-основа для построения таблиц с данными;
извлекается таблица данных;
осуществляется проверка того, является ли источник данных таблицы пустым;
извлекаются отступы заголовка для заданного столбца и заданной строки таблицы;
извлекаются постоянные ключи для заданного столбца и заданной строки таблицы;
для заданного столбца и заданной строки извлекаются постоянные ключи родительских столбцов;
извлекается номер родительского столбца по его постоянному ключу;
извлекается номер родительской строки по ее постоянному ключу;
извлекается постоянный ключ для столбца со спарклайнами;
создается новый объект-наблюдатель событий источника данных таблицы;
вызывается событие обновления данных таблицы;
осуществляется асинхронное обновление данных таблицы.
В базовый пример «Отображение экспресс-отчёта» необходимо добавить следующий файл:
DataViewDatasourceExample.h/.m. Делегат источника данных.
Для выполнения примера необходимо разместить в теле метода executeExample класса ViewController (см. раздел «Отображение экспресс-отчёта») следующий код:
// Получаем массив контроллеров представлений данных
NSArray *controllers =[m_controller dataViewControllers];
// Перебираем в цикле контроллеры представлений данных
for(NSObject *controller in controllers)
{
// Проверяем, является ли текущий контроллер контроллером представления данных в виде таблицы
if([controller isMemberOfClass:[MAGridDataViewController class]])
{
// Получаем объект контроллера представления данных в виде таблицы
MAGridDataViewController *gridController = (MAGridDataViewController *)controller;
// Получаем источник данных таблицы
GridDataViewDatasource *grid = [gridController gridDatasource];
// Получаем объект-основу для построения таблиц с данными
SPPLPivot pivot = [grid pivot];
// Получаем источник данных объекта-основы для построения таблиц с данными
SPPLDataSource datasource = pivot->dataSource();
// Получаем массив измерений источника данных
SNArray dimensions = datasource->dimensions();
// Выводим в консоль среды разработки наименования измерений в источнике данных
NSLog(@"Измерения, содержащиеся в источнике данных объекта-основы для построения таблиц с данными:");
for(int i = 0; i < dimensions->count(); i++)
{
SPPLDimension dimension = dimensions->objectAtIndex<PPLDimension>(i);
NSLog(@"%@", dimension->name()->nsString());
}
// Получаем таблицу данных
SPPLPivotTable pivotTable = [grid pivotTable];
// Проверяем, не является ли источник данных таблицы пустым
if([grid isEmpty] == NO)
{
// Получаем представление контроллера
UIView *view = [gridController view];
// Получаем массив вложенных представлений
NSArray *subviews = [view subviews];
// Перебираем в цикле вложенные представления
for(NSObject *subview in subviews)
{
// Проверяем, является ли текущее представление табличным представлением
if([subview isMemberOfClass:[NuGridView class]])
{
// Получаем объект табличного представления
NuGridView *gView = (NuGridView *)subview;
// Проверяем наличие в таблице необходимого количества столбцов
if(pivotTable->columnCount() > 1)
{
// Получаем отступ и выводим в консоль среды разработки отступ заголовка для столбца с индексом 1
NSInteger indentForHeader = [grid gridView:gView indentForHeaderForColumn:1 number:0];
NSLog(@"Отступ заголовка для столбца с индексом 1: %i", indentForHeader);
// Получаем постоянный ключ столбца
MAGridDataSourcePersistentKey *columnPersistentKey = [grid columnPersistentKeyByNumber:1];
// Получаем постоянный ключ родительского столбца
MAGridDataSourcePersistentKey *parentColumn = [grid parentColumnOfColumn:columnPersistentKey];
// Проверяем результат получения родительского столбца
if(parentColumn != nil)
{
// Выводим в консоль среды разработки номер родительского столбца, полученный по его постоянному ключу
NSLog(@"Номер родительского столбца для столбца 1: %i", [grid columnNumberByPersistentKey: parentColumn]);
}
else
{
NSLog(@"Родительский столбец для столбца %d отсутствует", [grid columnNumberByPersistentKey:columnPersistentKey]);
}
}
else
{
NSLog(@"Не удалось получить столбец");
}
// Проверяем наличие в таблице необходимого количества строк
if(pivotTable->rowCount() > 1)
{
// Получаем отступ и выводим в консоль среды разработки отступ заголовка для строки с индексом 1
NSInteger indentForHeader = [grid gridView:gView indentForHeaderForRow:1 number:0];
NSLog(@"Отступ заголовка для строки с индексом 1: %i", indentForHeader);
// Получаем постоянный ключ строки
MAGridDataSourcePersistentKey *rowPersistentKey = [grid rowPersistentKeyByNumber:1];
// Получаем постоянный ключ родительской строки
MAGridDataSourcePersistentKey *parentRow = [grid parentRowOfRow:rowPersistentKey];
// Проверяем результат получения родительской строки
if(parentRow != nil)
{
// Выводим в консоль среды разработки номер родительской строки, полученный по ее постоянному ключу
NSLog(@"Номер родительской строки для строки 1: %i", [grid rowNumberByPersistentKey: parentRow]);
}
else
{
NSLog(@"Родительская строка для строки %d отсутствует", [grid rowNumberByPersistentKey:rowPersistentKey]);
}
}
else
{
NSLog(@"Не удалось получить строку");
}
break;
}
}
// Получаем постоянный ключ для столбца со спарклайнами
MAGridDataSourcePersistentKey *sparklineColumnKey = [grid sparklineColumnPersistentKey];
// Выводим в консоль среды разработки описание постоянного ключа для столбца со спарклайнами
NSLog(@"Описание постоянного ключа для столбца со спарклайнами: %@",[sparklineColumnKey description]);
}
// Обновляем источник данных таблицы
[grid updateAsync];
break;
}
}
Также необходимо заменить код в файле статичного примера MAExpressAnalysisReportViewControllerDelegateImpl.mm в методе initWithOlapReport: в блоке:
if (self.isGridEnabled)
на следующий код:
// Получаем настройки отчета
SNDictionary gridOlapPlist = m_olapReport->storageDictionary()->objectForKey<NDictionary>(GRID_OLAP_KEY);
// Создаем отчет
SPPLOlapReport gridOlapReport = NULL;
if (gridOlapPlist != NULL) {
gridOlapReport = PPLOlapReport::olapReport(m_olapReport->descriptor(), gridOlapPlist);
}
// Создаем объект-основу для построения таблицы данных
m_gridPivot = (gridOlapReport != NULL) ? PPLPivot::pivot(gridOlapReport) : PPLPivot::pivot(m_olapReport);
// Создаем таблицу данных
m_gridPivotTable = PPLPivotTable::pivotTable(m_gridPivot);
// Получаем настройки таблицы данных
SNDictionary gridPivotTablePlist = m_olapReport->storageDictionary()->objectForKey<NDictionary>(GRID_PIVOT_TABLE_KEY);
// Проверяем, является ли объект настроек таблицы пустым
if (gridPivotTablePlist != NULL)
{
// Устанавливаем настройки таблицы
m_gridPivotTable->setupFromPlist(gridPivotTablePlist);
}
else
{
// Применяем настройки таблицы
[self applyGridSettings];
}
// Создаем источник данных на основе таблицы данных
m_gridDatasource = [[GridDataViewDatasource alloc] initWithPivotTable:m_gridPivotTable];
В результате выполнения примера в консоли среды разработки будет выведена информация, полученная из источника данных таблицы, а также список измерений, содержащихся в объекте-основе для построения таблиц с данными:
Измерения, содержащиеся в источнике данных объекта-основы для построения таблиц с данными:
Calendar
World
Indicators
Отступ заголовка для столбца с индексом 1: 0
Родительский столбец для столбца 1 отсутствует
Отступ заголовка для строки с индексом 1: 1
Номер родительской строки для строки 1: 0
Описание постоянного ключа для столбца со спарклайнами: <MAGridDataSourcePersistentKey=nil>
Далее необходимо создать класс делегата источника данных таблицы, в котором реализована обработка событий таблицы, добавить заголовочный файл класса в исходный код класса ViewController, а также разместить в теле метода executeExample после блока
if([grid isEmpty] == NO)
следующий код:
// Создаем объект-наблюдатель событий источника данных таблицы DataViewDatasourceExample *exampleDelegate = [[DataViewDatasourceExample alloc] initWithName: @"gridDatasource"]; // Подписываем объект-наблюдатель на события источника данных [grid addEventObserver:exampleDelegate]; // Вызываем событие обновления данных [grid pivotTableUpdated];
В результате выполнения обновленного примера в консоли среды разработки дополнительно будет выведено сообщение о вызванном событии обновления данных таблицы:
gridDatasource: Cобытие обновления данных, код события: 1
См. также: