Работа с прокси-источником данных таблицы

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

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

Описание

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

Исходный код

Для выполнения примера необходимо в теле метода 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];
                // Сохраняем первоначальное состояние прокси-источника данных
                NSData *state = [proxyDatasource saveState];
                // Выводим в консоль среды разработки результат проверки того, являются ли ширина заданного столбца и высота заданной строки фиксированными
                NSLog(@"Ширина столбца 1 %@является фиксированной", [proxyDatasource isWidthFixedForColumnWithKey: 1]? @"":@"не ");
                NSLog(@"Высота строки 1 %@является фиксированной", [proxyDatasource isHeightFixedForRowWithKey:1]? @"":@"не ");
                // Фиксируем высоту ячейки для заданной строки
                [proxyDatasource fixHeight:20 forRowWithKey:1];
                // Фиксируем ширину ячейки для заданного столбца
                [proxyDatasource fixWidth:40 forColumnWithKey:1];
                // Выводим в консоль среды разработки сообщение о добавлении строки с фиксированной высотой
                NSLog(@"Добавление строки с фиксированной высотой");
                // Выводим в консоль среды разработки сообщение о добавлении столбца с фиксированной шириной
                NSLog(@"Добавление столбца с фиксированной шириной");
                // Выводим в консоль среды разработки результат повторной проверки того, являются ли ширина заданного столбца и высота заданной строки фиксированными
                NSLog(@"Ширина столбца 1 %@является фиксированной", [proxyDatasource isWidthFixedForColumnWithKey: 1]? @"":@"не ");
                NSLog(@"Высота строки 1 %@является фиксированной", [proxyDatasource isHeightFixedForRowWithKey:1]? @"":@"не ");
                // Получаем источник данных таблицы
                GridDataViewDatasource *dataSource =[proxyDatasource dataSource];
                // Выводим в консоль среды разработки сообщение о том, является ли источник данных пустым
                NSLog(@"Источник данных таблицы пуст? %@", [dataSource isEmpty]? @"да":@"нет");
                // Получаем делегат таблицы
                MAGridDelegate *gridDelegateFromProxy = [proxyDatasource gridDelegate];
                // Выводим в консоль среды разработки заголовок контроллера связанного представления данных в виде таблицы, полученный с помощью делегата
                NSLog(@"Заголовок контроллера связанного представления данных в виде таблицы: %@",[[gridDelegateFromProxy dataViewController] title]);
                // Получаем и выводим в консоль среды разработки отступ ячейки в заданном столбце заголовков
                NSInteger columnIndent = [proxyDatasource gridView:gView indentForHeaderForColumn:0 number:0];
                NSLog(@"Отступ ячейки в столбце заголовков с индексом 0: %d", columnIndent);
                // Получаем и выводим в консоль среды разработки отступ ячейки в заданной строке заголовков
                NSInteger rowIndent = [proxyDatasource gridView:gView indentForHeaderForRow:1 number:0];
                NSLog(@"Отступ ячейки в строке заголовков с индексом 1: %d", rowIndent);
                // Выделяем заданные ячейки таблицы
                [[gView controller] selectAreaFromRow:[gView rowWithNumber:0] column:[gView columnWithNumber:0] toRow:[gView rowWithNumber:1] column:[gView columnWithNumber:1]];
                // Получаем массивы выделенных строк и столбцов таблицы
                NSSet *selectedRows = [[NSMutableSet new] autorelease];
                NSSet *selectedColumns = [[NSMutableSet new] autorelease];
                NuGridSelectionArea *selectionArea = gView.selectionArea;
                for (NuGridRow *row in selectionArea.cellArea.rows)
                {
                    [(NSMutableSet *)selectedRows addObject:[NSNumber numberWithInt:row.rowNumber]];
                }
                for (NuGridColumn *column in selectionArea.cellArea.columns) {
                    [(NSMutableSet *)selectedColumns addObject:[NSNumber numberWithInt:column.columnNumber]];
                }
                // Устанавливаем в прокси-источнике данных область выделения ячеек таблицы
                [proxyDatasource setSelectionWithRows:selectedRows columns:selectedColumns];
                // Получаем область выделения ячеек таблицы из прокси-источника данных
                NSDictionary *gridSelection = [proxyDatasource gridSelection];
                // Выводим в консоль среды разработки информацию из полученного справочника
                NSLog(@"Тип справочника для хранения области выделения таблицы: %@", [gridSelection valueForKey:@"type"]);
                NSLog(@"Количество выделенных столбцов: %d",[[gridSelection valueForKey:@"columns"] count]);
                NSLog(@"Количество выделенных строк: %d",[[gridSelection valueForKey:@"rows"] count]);
                // Удаляем область выделения ячеек таблицы
                [proxyDatasource clearGridSelection];
                // Выводим в консоль среды разработки сообщение об удалении области выделения ячеек таблицы
                NSLog(@"Удаление области выделения ячеек таблицы из прокси-источника данных");
                // Выводим в консоль среды разработки количество выделенных элементов в справочнике для хранения области выделения таблицы
                NSLog(@"Количество выделенных столбцов: %d",[[gridSelection valueForKey:@"columns"] count]);
                NSLog(@"Количество выделенных строк: %d",[[gridSelection valueForKey:@"rows"] count]);
                // Получаем данные без итогов для заданной строки
                NuGridSparklineData *data = [proxyDatasource getRowDataWithoutTotals: 1];
                // Выводим в консоль среды разработки номер и значение ячейки, содержащей максимальное значение в строке
                NSLog(@"Максимум строки 1 в ячейке %d, значение: %f", [data maxPeakElementIndex], [data maxValue]);
                // Устанавливаем признак готовности прокси-источника данных
                [proxyDatasource setReady:YES];
                // Выполняем синхронное обновление прокси-источника данных
                [proxyDatasource updateSync];
                // Создаем и заполняем справочник, содержащий параметры, необходимые для метода continueExample:
                NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
                [dict setValue: state forKey:@"state"];
                [dict setValue: proxyDatasource forKey:@"proxyDatasource"];
                // Вызываем после паузы метод, продолжающий выполнение примера
                [self performSelector:@selector(continueExample:) withObject:dict afterDelay:5];
            }
        }
    }
}

Также необходимо в классе ViewController  добавить следующий метод вместе с его реализацией:

// Продолжает выполнение примера
- (void) continueExample: (NSDictionary *) dict
{
    // Извлекаем из справочника прокси-источник данных таблицы
    MAGridProxyDataSource *proxyDatasource = [dict valueForKey:@"proxyDatasource"];
    // Извлекаем из справочника сохраненное состояние прокси-источника данных
    NSData *state = [dict valueForKey:@"state"];
    // Загружаем состояние прокси-источника данных
    if(proxyDatasource != nil && state != nil) [proxyDatasource loadState:state];
}

 В результате выполнения примера на экране мобильного устройства будет отображен экспресс-отчет, содержащий таблицу, для которой установлено выделение ячеек, а также изменены высота и ширина для указанных строк и столбцов:

Также в консоли среды разработки будет выведена информация о прокси-источнике данных таблицы:

Ширина столбца 1 не является фиксированной

Высота строки 1 не является фиксированной

Добавление строки с фиксированной высотой

Добавление столбца с фиксированной шириной

Ширина столбца 1 является фиксированной

Высота строки 1 является фиксированной

Источник данных таблицы пуст? нет

Заголовок контроллера связанного представления данных в виде таблицы: Таблица

Отступ ячейки в столбце заголовков с индексом 0: 0

Отступ ячейки в строке заголовков с индексом 1: 1

Тип справочника для хранения области выделения таблицы: cells

Количество выделенных столбцов: 2

Количество выделенных строк: 2

Удаление области выделения ячеек таблицы из прокси-источника данных

Количество выделенных столбцов: 0

Количество выделенных строк: 0

Максимум строки 1 в ячейке 10, значение: 29763.284441

 

Через пять секунд после запуска примера будет восстановлено первоначальное состояние таблицы:

Далее заменим строку кода:

[proxyDatasource setReady:YES];

 на следующую строку:

[proxyDatasource setReady:NO];

С помощью этого действия будет установлено новое значение признака готовности прокси-источника данных таблицы, которое запрещает выполнение синхронного обновления. В результате выполнения обновленного примера на экране мобильного устройства будет отображен экспресс-отчет, содержащий таблицу, для которой не будут отображены изменения, заданные в коде примера. Внешний вид экспресс-отчета в обновленном примере совпадает с внешним видом экспресс-отчета после восстановления сохраненного состояния прокси-источника данных.

Область выделения ячеек в прокси-источнике данных также можно получить с помощью контроллера представления данных в виде таблицы, для этого необходимо заменить строки:

// Получаем область выделения ячеек таблицы из прокси-источника данных
NSDictionary *gridSelection = [proxyDatasource gridSelection];

на следующий код:

// Получаем область выделения ячеек таблицы с помощью контроллера представления данных в виде таблицы
NSDictionary *gridSelection = [gridController gridSelection];

См. также:

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