Добавление меню в таблице

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

В результате выполнения примера при нажатии на любую ячейку таблицы будет отображено меню с пунктом «Выделить»:

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

См. также:

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