2

在此处输入图像描述 我要实现收音机菜单,这是我这一代的菜单

subMenu.addItemWithTitle("Item001", action: Selector("testAction:"), keyEquivalent: "\(code)")
subMenu.addItemWithTitle("Item002", action: Selector("testAction:"), keyEquivalent: "\(code)")
subMenu.addItemWithTitle("Item003", action: Selector("testAction:"), keyEquivalent: "\(code)")
subMenu.addItemWithTitle("Item004", action: Selector("testAction:"), keyEquivalent: "\(code)")
subMenu.addItemWithTitle("Item005", action: Selector("testAction:"), keyEquivalent: "\(code)")
subMenu.addItemWithTitle("Item006", action: Selector("testAction:"), keyEquivalent: "\(code)")

在此处输入图像描述 如何单选菜单?

func testAction(sender: NSMenuItem){
    sender.state = Int(!Bool(sender.state))
    if(sender.action == Selector("testAction:")){
        var itemMore:NSMenuItem!
        for itemMore:AnyObject in sender.menu.itemArray {
            if (itemMore.action() == sender.action){
                itemMore.state = (itemMore == sender) ? NSOnState : NSOffState;
            }
        }
    }
}
4

3 回答 3

4

一、解决办法:

func testAction(sender: NSMenuItem){
    sender.state = Int(!Bool(sender.state))
    if(sender.action == Selector("testAction:")){
        for itemMore in sender.menu.itemArray as [NSMenuItem!]{
            if (itemMore.action == sender.action){
                itemMore.state = (itemMore == sender) ? NSOnState : NSOffState;
            }
        }
    }
}

现在解释一下:要设置 menuItem 的 state 属性,编译器必须知道它是 NSMenuItem 类型。这是通过 for-in 循环中的向下转换完成的:as [NSMenuItem!],正如我所见,这是您尝试使用上面的行:var itemMore:NSMenuItem!。(不过,您现在可以删除它。)您正确地选择了一个隐式展开的可选项,因为 menu.itemArray 保证不包含 nil 值。

如果你不这样做,编译器会将 menuItem 视为 AnyObject,它恰好有一个 NSURLSessionTaskState 类型的属性,也称为“状态”。尝试将其设置为 Int(本质上是 NSOnState/NSOffState)会引发编译器错误。

于 2014-08-09T21:50:02.597 回答
1

这个怎么样

func testAction(sender: NSMenuItem){
    sender.state = Int(!Bool(sender.state))
    if(sender.action == Selector("testAction:")) {
        var itemMore:NSMenuItem!
        for itemMore:AnyObject in sender.menu.itemArray {
            if let menuItem = itemMore as? NSMenuItem {  // -- need to downcast first
                if (menuItem.action == sender.action){
                    menuItem.state = (menuItem == sender) ? NSOnState : NSOffState;
                }
            }
        }
    }
}
于 2014-08-09T18:32:25.993 回答
0

我将用 Objective-C 编写。翻译成 Swift 由你决定。

for (NSMenuItem* item in [[sender menu] itemArray])
{
    if (item.action == sender.action)
        item.state = (item == sender) ? NSOnState : NSOffState;
}
于 2014-08-09T14:30:16.360 回答