Требования к операционной системе: iOS 5.0 и выше.
Мобильное устройство: iPad.
В данном примере описывается реализация меню в таблице. После его запуска выполняются следующие операции:
создаются и устанавливаются пункты меню;
устанавливается выравнивание текста пунктов меню;
определяется расположение стрелки у всплывающего меню и область его построения;
для меню устанавливается делегат и таблица, для которой оно вызывается;
обрабатывается событие нажатия на ячейку таблицы, после которого отображается меню. Если ячейка не подсвечена, то доступен пункт меню «Выделить», если подсвечена - то меню «Снять выделение»;
создаётся экземпляр одноэлементного пула для общего доступа к элементу.
Для выполнения примера необходимо в классе ViewController (см. раздел «Создание простой электронной таблицы») добавить следующие методы вместе с их реализацией:
// Создаёт пункты меню
- (NSArray *)makeMenuItemsForCell:(NuGridCell *)cell {
NSMutableArray *items = [[NSMutableArray new] autorelease];
// Определяем действие, вызываемое после выбора пункта меню
SEL changeCellSelection = @selector(changeCellSelection:);
if ([cell isHighLighted]) {
// Если ячейка не подсвечена, то отображаем пункт меню "Снять выделение"
UIMenuItem *firstMenuItem = [[[UIMenuItem alloc] initWithTitle:@"Снять выделение" action:changeCellSelection] autorelease];
[items addObject:firstMenuItem];
} else {
// Если ячейка подсвечена, то отображаем пункт меню "Выделить"
UIMenuItem *secondMenuItem = [[[UIMenuItem alloc] initWithTitle:@"Выделить" action:changeCellSelection] autorelease];
[items addObject:secondMenuItem];
}
return items;
}
// Изменяет состояние выделения ячейки
- (void)changeCellSelection:(id)sender {
// Получаем последнюю нажатую ячейку
NuGridCell *lastTouchedCell = [contr gridView].controller.lastTouchedCell;
if (lastTouchedCell) {
// Проверяем, подсвечена ли ячейка таблицы
if ([lastTouchedCell isHighLighted]) {
// Восстанавливаем исходный фон ячейки таблицы
[lastTouchedCell setBackgroundColor:[[lastTouchedCell style] backgroundColor]];
[lastTouchedCell setIsHighLighted:NO];
} else {
// Изменяем фон ячейки таблицы
[lastTouchedCell setBackgroundColor:[UIColor lightGrayColor]];
[lastTouchedCell setIsHighLighted:YES];
}
}
}
Теперь обработаем событие нажатия на ячейку таблицы, после наступления которого будет отображаться меню. Приведём три способа реализации данного обработчика:
1. Первый способ.
- (void)gridView:(NuGridView *)gridView wasTouchedInCell:(NuGridCell *)cell {
// Создаём менеджер меню
NuMenuController *menuCtrl = [NuMenuController sharedMenuController];
// Создаём и устанавливаем пункты меню
[menuCtrl setMenuItems:[self makeMenuItemsForCell:cell]];
// Определяем настройки меню
[menuCtrl setRect:cell.frame inView:gridView forTarget:[gridView gridDelegate]];
// Определяем направление стрелки у всплывающего меню
[menuCtrl setArrowDirection: UIPopoverArrowDirectionUp];
// Текст пунктов меню выравниваем по центру
[[menuCtrl menu] setTextAlignment:UITextAlignmentCenter];
// Отображаем меню, используя анимацию
[menuCtrl setMenuVisible:YES animated:YES];
}
2. Второй способ.
- (void)gridView:(NuGridView *)gridView wasTouchedInCell:(NuGridCell *)cell {
// Создаём менеджер меню
NuMenuController *menuCtrl = [NuMenuController sharedInstance];
// Создаём и устанавливаем пункты меню
[menuCtrl setMenuItems:[self makeMenuItemsForCell:cell]];
// Устанавливаем делегат для меню
[menuCtrl setTarget:[gridView gridDelegate]];
// Создаём и устанавливаем пункты меню
[menuCtrl setTargetRect:[cell frame]];
// Устанавливаем таблицу, для которой вызывается меню
[menuCtrl setTargetView:gridView];
// Определяем направление стрелки у всплывающего меню
[menuCtrl setArrowDirection: UIPopoverArrowDirectionUp];
// Текст пунктов меню выравниваем по центру
[[menuCtrl menu] setTextAlignment:UITextAlignmentCenter];
// Отображаем меню
[menuCtrl setMenuVisible:YES];
}
3. Третий способ.
- (void)gridView:(NuGridView *)gridView wasTouchedInCell:(NuGridCell *)cell {
// Отображаем всплывающее меню
[self showPopoverForCell: cell];
}
// Отображает всплывающее окно
- (void) showPopoverForCell:(NuGridCell*) cell {
NuMenu *menu = [[[NuMenu alloc] init] autorelease];
[menu setDelegate: self];
[menu setItems:[self makeMenuItemsForCell:cell]];
// Текст пунктов меню выравниваем по центру
[menu setTextAlignment:UITextAlignmentCenter];
CGRect rect = [cell frame];
popover = [[UIPopoverController alloc] initWithContentViewController:menu];
[popover presentPopoverFromRect:rect inView:[contr gridView] permittedArrowDirections:UIPopoverArrowDirectionUp animated:YES];
[popover setDelegate:self];
if ([[contr gridView] respondsToSelector:@selector(setScrollEnabled:)]) {
[(UIScrollView *)[contr gridView] setScrollEnabled:NO];
}
}
В результате выполнения примера при нажатии на любую ячейку таблицы будет отображено меню с пунктом «Выделить»:

После выбора данного пункта меню соответствующая ячейка будет подсвечена. Чтобы снять выделение, нужно снова щёлкнуть по ячейке и выбрать пункт меню «Снять выделение»:

См. также: