Требования к операционной системе: 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];
См. также: