Состояние настройки NSMenuItem не работает

У меня есть приложение на основе документов в Swift 1.2. Я хочу иметь программно сгенерированные NSMenuItem, которые имеют действие с текущим NSDocument, а затем проверить этот выбор. Вот что у меня есть до сих пор:

Делегирование приложения

// generate items
for thing in thingArray {
    var newThing = NSMenuItem(title:name, action: Selector("myMethod:"), keyEquivalent: "")
    newThing.enabled = true
    submenu.addItem(newThing)
}

Мой документ

// getting current AppDelegate
let app = NSApplication.sharedApplication().delegate as! AppDelegate

// called by user selected menu item
@IBAction func myMethod(sender: NSMenuItem) {
    let parent = sender.parentItem!

    // iterate through all Items to setState: NSOffState

    for item in parent.submenu!.itemArray as! [NSMenuItem] {
        if workspace?.name == item.title {
            item.state = NSOnState     
            break
        }
    }
}

Я знаю, что весь код до item.state работает. Я положил журналы печати, чтобы проверить это. Но обычно происходит то, что пункт меню не проверяется, но иногда это происходит.

Я думаю, что меню не обновляется, но я не знаю, как это сделать. Может также случиться так, что действие NSMenuItem отправляется через цепочку оперативного реагирования? Любая помощь будет принята с благодарностью.


person GW.Rodriguez    schedule 01.02.2016    source источник
comment
Более эффективный способ сделать это — создать переменную экземпляра currentIndex, содержащую индекс текущего пункта меню. При вызове функции myMethod установите состояние пункта меню с currentIndex на NSOffState, а состояние sender на NSOnState. Затем установите currentIndex в индекс sender. Это позволяет избежать повторения цикла.   -  person vadian    schedule 01.02.2016
comment
Где снять галочку с пункта меню?   -  person Willeke    schedule 01.02.2016
comment
@vadian Это была отличная идея (и я все равно сделаю это), но у меня такое же поведение.   -  person GW.Rodriguez    schedule 01.02.2016
comment
@Willeke Я не включил это в опубликованный код, но я отредактирую свой исходный пост, чтобы показать, когда я это сделаю.   -  person GW.Rodriguez    schedule 01.02.2016


Ответы (1)


Хорошо... Я понимаю, что происходит. Часть в AppDelegate, которая создает пункты меню, вызывается каждые 3 секунды (часть API, который я использую). Проблема заключалась в том, что пункты меню воссоздавались, поэтому состояния, которые я устанавливал, не всегда были текущими NSMenuItem, которые были в меню.

Я обнаружил, что могу использовать validateMenuItem в NSDocument для обновления каждого пункта меню, соответствующего моим критериям.

override func validateMenuItem(menuItem: NSMenuItem) -> Bool {
    menuItem.state = workspaceIndex == menuItem.tag ? NSOnState : NSOffState
    return true
}
person GW.Rodriguez    schedule 01.02.2016