2016-02-01 3 views
1

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

AppDelegate

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

MyDocument

// 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 отправляется через цепочку первого ответчика? Любая помощь будет принята с благодарностью.

+1

Более эффективный способ сделать это - создать переменную экземпляра 'currentIndex', содержащую индекс текущего пункта меню. Когда вызывается функция 'myMethod', задайте состояние элемента меню в' currentIndex' 'NSOffState' и состояние' sender' 'NSOnState'. Затем установите 'currentIndex' в индекс' sender'. Это позволяет избежать цикла повторения. – vadian

+0

Где вы снимите этот пункт меню? – Willeke

+0

@vadian Это была отличная идея (и я сделаю это независимо), но у меня такое же поведение. – GWRodriguez

ответ

1

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

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

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