Можно ли сгруппировать элементы в NSPopupButton? - PullRequest
0 голосов
/ 18 ноября 2018

Я пытаюсь отобразить список системных голосов, но я бы хотел сгруппировать их по регионам.

Это пример выбора в html.

Drop down menu with grouped items

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

enter image description here

Есть ли способ воспроизвести это в Интерфейсном Разработчике / swift? Любые указатели будут оценены.

Обновление:

Причина этого в том, что я показываю пользователю список речевых голосов. На данный момент он смешивает все регионы, что очень запутанно.

voice drop down

Есть обновление, над которым я работаю, где я могу отобразить «Английский (Великобритания)», но я бы хотел сгруппировать их перед выпуском.

Ответы [ 3 ]

0 голосов
/ 20 ноября 2018

Если у вас нет заголовка группы, вы можете использовать следующий код

let items = [["First","Second"],["First","Second"],["First","Second"]]

lazy var addNewViewButton : NSPopUpButton = {
    let popupButton = NSPopUpButton()

    let menu = NSMenu()
    for item in items
    {
        for title in item
        {
            let menuItem = NSMenuItem(title: title, action: nil, keyEquivalent: "")
            menuItem.target = self
            menu.addItem(menuItem)
        }
        menu.addItem(NSMenuItem.separator())
    }
    popupButton.menu = menu

    popupButton.translatesAutoresizingMaskIntoConstraints = false

    return popupButton
}()

Результат:

enter image description here

0 голосов
/ 01 июля 2019

Я собираюсь предложить ответ в Objective-C, потому что я не знаком со Swift.Извините ... Вы должны быть в состоянии перевести это достаточно легко, хотя, или я уверен, что кто-то здесь может сделать это.

Итак, мне удалось это сделать, создав подкласс NSMenu с помощью следующего метода:

@implementation MenuWithSections

- (NSMenuItem*)insertItemWithTitle:(NSString*)aString action:(SEL)aSelector keyEquivalent:(NSString*)keyEquiv atIndex:(NSInteger)index
{
    NSMenuItem * item;
    NSString * adjustedString;

    if ([aString isEqualToString:menuDividerString]) {
        NSMenuItem *separator = [NSMenuItem separatorItem];
        [self insertItem:separator atIndex:index];
        return separator;
    } else if ([aString hasPrefix:menuSectionHeaderPrefix]) {
        adjustedString = [[aString substringFromIndex:menuSectionHeaderPrefix.length] capitalizedString];
        NSMenuItem * sectionHead =  [[NSMenuItem alloc] initWithTitle:adjustedString
                                                           action:nil
                                                    keyEquivalent:@""];
        sectionHead.enabled = NO;
        sectionHead.indentationLevel = 0;
        [self insertItem:sectionHead atIndex:index];
        return sectionHead;
    } 

    item = [super insertItemWithTitle:aString action:aSelector keyEquivalent:keyEquiv atIndex:index];
    item.indentationLevel = 1;
    return item;
}

@end

menuDividerString в моем случае - @ "----", а menuSectionHeaderPrefix - @ "..";см. примеры ниже.

Чтобы заставить его работать, сделайте три вещи:

  1. В IB разверните всплывающую кнопку, пока не увидите ее меню, и установите классменю в «MenuWithSections». раскрывающаяся всплывающая кнопка

  2. Отключить функцию «автоматического включения» всплывающей кнопки (отключите ее на вкладке «Атрибуты» IB или установите значение «НЕТ»).программно)

  3. Передайте измененные строки, используя вышеуказанные константы, чтобы получить желаемый эффект.

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

[self.popbutton addItemsWithTitles:@[ @"..swedish cars", @"Volvo", @"Saab", @"..German cars", @"Mercedes", @"Audi"]];

секционное всплывающее окно

или если вы хотите разделительную линию между двумя группами, используйте:

[self.popbutton addItemsWithTitles:@[ @"..swedish cars", @"Volvo", @"Saab", @"----", @"..German cars", @"Mercedes", @"Audi"]];

секционное всплывающее окно с разделителем

0 голосов
/ 20 ноября 2018

Следующее меню групп кодов, но не так, как вы упомянули.

let items = [["First","Second"],["First","Second"],["First","Second"]]

lazy var addNewViewButton : NSPopUpButton = {
    let popupButton = NSPopUpButton()

    let firstMenuItem = NSMenuItem(title: "First Group", action: nil, keyEquivalent: "")
    let secondMenuItem = NSMenuItem(title: "Second Group", action: nil, keyEquivalent: "")
    let thirdMenuItem = NSMenuItem(title: "Third Group", action: nil, keyEquivalent: "")

    let superMenu = NSMenu()
    superMenu.addItem(firstMenuItem)
    superMenu.addItem(secondMenuItem)
    superMenu.addItem(thirdMenuItem)

    for (index,item) in items.enumerated()
    {
        let menu = NSMenu()
        for title in item
        {
            let menuItem = NSMenuItem(title: title, action: nil, keyEquivalent: "")
            menuItem.target = self
            menu.addItem(menuItem)
        }
        menu.addItem(NSMenuItem.separator())
        superMenu.setSubmenu(menu, for: superMenu.items[index])
    }
    popupButton.menu = superMenu

    popupButton.translatesAutoresizingMaskIntoConstraints = false

    return popupButton
}()

Добавьте всплывающую кнопку в ваш код, и вы получите результаты, подобные этому

enter image description here

Каждый из них будет иметь свои собственные предметы внутри.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...