Выполнение транзакций по изменению настроек прокси-источника данных таблицы

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

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

Описание

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

Необходимые файлы

В базовый пример «Отображение экспресс-отчёта» необходимо добавить следующий файл:

Исходный код

Для выполнения примера необходимо создать класс, предназначенный для получения сообщений об обновлении прокси-источника данных таблицы, а также добавить заголовочный файл класса в исходный код класса 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];

См. также:

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