Требования к операционной системе: iOS 5.0 и выше.
Мобильное устройство: iPad.
В данном примере описывается выполнение транзакций по изменению настроек прокси-источника данных таблицы. После запуска примера выполняются следующие операции:
извлекается прокси-источник данных таблицы;
устанавливается масштаб представления данных в виде таблицы в прокси-источнике данных;
извлекается максимальная ширина ячейки из прокси-источника данных;
выполняется автоматический подбор размера ячеек таблицы;
устанавливается массив свернутых экспандеров в прокси-источнике данных таблицы;
удаляются указанная строка и столбец в таблице;
осуществляется транзакция по изменению настроек прокси-источника данных с рассылкой уведомлений;
осуществляется транзакция по изменению настроек прокси-источника данных без рассылки уведомлений.
В базовый пример «Отображение экспресс-отчёта» необходимо добавить следующий файл:
gridUpdateObserver.h/.m. Класс, предназначенный для получения сообщений об обновлении прокси-источника данных таблицы.
Для выполнения примера необходимо создать класс, предназначенный для получения сообщений об обновлении прокси-источника данных таблицы, а также добавить заголовочный файл класса в исходный код класса ViewController (см. раздел «Отображение экспресс-отчёта»). Таблица в источнике данных должна содержать ячейки с экспандерами по индексам, указанным в коде метода executeExample (фрагмент кода, в котором осуществляется заполнение значениями массива для хранения координат свернутых экспандеров таблицы). Далее необходимо разместить в теле метода executeExample класса ViewController следующий код:
// Получаем массив представлений данных
NSArray *controllers =[m_controller dataViewControllers];
// Перебираем в цикле контроллеры представлений данных
for(NSObject *controller in controllers)
{
// Проверяем, является ли текущее представление представлением данных в виде таблицы
if([controller isMemberOfClass:[MAGridDataViewController class]])
{
// Получаем объект представления данных в виде таблицы
MAGridDataViewController *gridController = (MAGridDataViewController *)controller;
// Получаем представление данных в виде таблицы
UIView *view = [gridController view];
// Получаем массив вложенных представлений
NSArray *subviews = [view subviews];
// Перебираем в цикле вложенные представления
for(NSObject *subview in subviews)
{
// Проверяем, является ли текущее представление табличным представлением
if([subview isMemberOfClass:[NuGridView class]])
{
// Получаем объект табличного представления
NuGridView *gView = (NuGridView *)subview;
// Получаем объект делегата таблицы
MAGridDelegate *gridDelegate = (MAGridDelegate *)[gView gridDelegate];
// Получаем прокси-источник данных таблицы
MAGridProxyDataSource *proxyDatasource =[gridDelegate proxyDataSource];
// Устанавливаем масштаб представления данных в виде таблицы в прокси-источнике данных
[proxyDatasource setGridViewZoomScale: [NSNumber numberWithFloat:0.5]];
// Вызываем внутренний метод представления данных в виде таблицы, который устанавливает масштаб представления данных в виде таблицы
[gridController performSelector:@selector(setupGridViewZoom) withObject:nil];
// Получаем и выводим в консоль среды разработки максимальную ширину ячейки из прокси-источника данных
int maxCellWidth = [proxyDatasource maxCellWidth];
NSLog(@"Максимальная ширина ячейки в прокси-источнике данных: %d", maxCellWidth);
// Выполняем автоматический подбор размера ячеек таблицы
[proxyDatasource adaptCellsSizeInGridView:gView forWidth:60];
// Вызываем внутренний метод представления данных в виде таблицы, который обновляет максимальную ширину ячейки из прокси-источника данных
[gridController performSelector:@selector(updateColumnMaxWidth) withObject:nil];
// Получаем и выводим в консоль среды разработки максимальную ширину ячейки из прокси-источника данных после обновления значения
maxCellWidth = [proxyDatasource maxCellWidth];
NSLog(@"Максимальная ширина ячейки в прокси-источнике данных после обновления значения: %d", maxCellWidth);
// Создаем массив для хранения координат свернутых экспандеров таблицы
NSMutableArray *expanders = [[NSMutableArray alloc] init];
// Заполняем значениями массив для хранения координат свернутых экспандеров таблицы
MAGridDataViewControllerExpanderInfo *exp = [MAGridDataViewControllerExpanderInfo new];
exp.left = 0;
exp.top = 191;
[expanders addObject:exp];
MAGridDataViewControllerExpanderInfo *exp1 = [MAGridDataViewControllerExpanderInfo new];
exp1.left = 0;
exp1.top = 165;
[expanders addObject:exp1];
MAGridDataViewControllerExpanderInfo *exp2 = [MAGridDataViewControllerExpanderInfo new];
exp2.left = 0;
exp2.top = 119;
[expanders addObject:exp2];
MAGridDataViewControllerExpanderInfo *exp3 = [MAGridDataViewControllerExpanderInfo new];
exp3.left = 0;
exp3.top = 64;
[expanders addObject:exp3];
MAGridDataViewControllerExpanderInfo *exp4 = [MAGridDataViewControllerExpanderInfo new];
exp4.left = 0;
exp4.top = 9;
[expanders addObject:exp4];
// Задаем в прокси-источнике данных массив свернутых экспандеров таблицы
[proxyDatasource setCollapsedExpandersAtStartup:expanders];
// Получаем количество строк таблицы прокси-источника данных
int rowCount = [proxyDatasource gridViewRowCount:gView];
// Сворачиваем экспандеры таблицы, заданные в массиве свернутых экспандеров в прокси-источнике
for(MAGridDataViewControllerExpanderInfo *expander in [proxyDatasource collapsedExpandersAtStartup]) {
// Проверяем существование строки по индексу
if(expander.top < rowCount) {
// Получаем ячейку таблицы по заданным координатам
NuGridCell *cell = [proxyDatasource gridView:gView cellInRow:expander.top inColumn:expander.left];
// Проверяем, содержит ли полученная ячейка экспандер
if([cell isMemberOfClass: [NuGridExpandableCell class]]) {
// Сворачиваем экспандер полученной ячейки
[proxyDatasource gridView:gView collapseRow: expander.top];
}
}
}
// Создаем объект-наблюдатель событий прокси-источника данных таблицы
gridUpdateObserver *observer = [[gridUpdateObserver alloc] initWithName:@"Наблюдатель 1"];
// Подписываем объект-наблюдатель на события прокси-источника данных
[proxyDatasource addObserver:observer];
// Начинаем транзакцию по изменению настроек прокси-источника данных
[proxyDatasource beginSettingTransaction];
// Сохраняем состояние прокси-источника данных таблицы
NSData *state = [proxyDatasource saveState];
// Завершаем транзакцию по изменению настроек прокси-источника данных
[proxyDatasource endSettingTransaction];
}
}
}
}
В результате выполнения примера на экране мобильного устройства будет отображен экспресс-отчет, содержащий таблицу, для которой был изменен масштаб, произведен автоматический подбор размера ячеек, а также свернуты указанные экспандеры:

Кроме того в консоли среды разработки будет выведена информация о прокси-источнике данных таблицы, а также сообщения об обработке событий в объекте-наблюдателе, которые возникли в связи с осуществлением транзакции по изменению настроек прокси-источника данных с рассылкой уведомлений:
Максимальная ширина ячейки в прокси-источнике данных: 400
Максимальная ширина ячейки в прокси-источнике данных после обновления значения: 148
Действия объекта «Наблюдатель 1», выполняемые перед обновлением прокси-источника данных с ключом dataSource
Действия объекта «Наблюдатель 1», выполняемые после обновления прокси-источника данных с ключом dataSource
Далее в примере необходимо заменить строчки кода
// Начинаем транзакцию по изменению настроек прокси-источника данных [proxyDatasource beginSettingTransaction]; // Сохраняем состояние прокси-источника данных таблицы NSData *state = [proxyDatasource saveState]; // Завершаем транзакцию по изменению настроек прокси-источника данных [proxyDatasource endSettingTransaction];
на следующий код:
// Удаляем данные территориального измерения во второй строке таблицы [proxyDatasource gridView:gView removeRow:1 headerLevel:0]; // Удаляем данные календарного измерения во втором столбце таблицы [proxyDatasource gridView:gView removeColumn:1 headerLevel:0]; // Начинаем транзакцию по изменению настроек прокси-источника данных без рассылки уведомлений [proxyDatasource beginSilentSettingTransaction]; // Вызываем метод, который выполняет действия, необходимые перед обновлением прокси-источника данных, у всех наблюдателей прокси-источника данных [proxyDatasource beforeUpdate:@"beginSilentSettingTransaction"]; // Сохраняем состояние прокси-источника данных таблицы NSData *state = [proxyDatasource saveState]; // Завершаем транзакцию по изменению настроек прокси-источника данных без рассылки уведомлений [proxyDatasource endSilentSettingTransaction]; // Повторно вызываем метод, который выполняет действия, необходимые перед обновлением прокси-источника данных, у всех наблюдателей прокси-источника данных [proxyDatasource beforeUpdate:@"endSilentSettingTransaction"];
В результате выполнения обновленного примера на экране мобильного устройства будет отображен экспресс-отчет, содержащий таблицу, в которой были удалены указанные строки и столбцы:

Также в консоли среды разработки будет дополнительно выведено сообщение о выполнении в объекте-наблюдателе действий, необходимых перед обновлением прокси-источника данных:
Действия объекта «Наблюдатель 1», выполняемые перед обновлением прокси-источника данных с ключом endSilentSettingTransaction
Данное событие было вызвано с ключом «endSilentSettingTransaction» после завершения транзакции по изменению настроек прокси-источника данных без рассылки уведомлений. Аналогичное событие с ключом «beginSilentSettingTransaction» не произошло, поскольку было вызвано в программе во время осуществления транзакции.
Массив свернутых экспандеров таблицы в прокси-источнике данных также можно задать с помощью представления данных в виде таблицы, для этого необходимо заменить строки:
// Задаем в прокси-источнике данных массив свернутых экспандеров таблицы [proxyDatasource setCollapsedExpandersAtStartup:expanders];
на следующий код:
// Задаем в контроллере представления массив свернутых экспандеров таблицы [gridController setCollapsedExpandersAtStartup:expanders];
См. также: