按下修改键时,以编程方式更改按钮文本和操作

问题描述 投票:0回答:2

当按下⌥选项键时,我想更改NSButton的文本 - 类似于在OS X上检测到碰撞文件时的复制对话框,当保持选项键时,将“保持两者”更改为“合并”。

在我的情况下,我想更改一个带有文本的按钮,比如,当我按住选项键时,“删除”到“退出”。此外,其功能应根据其标题进行更改,与“复制”对话框中的选项非常相似。

这可以在Swift中以编程方式完成吗?

swift nsbutton
2个回答
2
投票

你可以使用addLocalMonitorForEvents(matching:)订阅并检测是否按下了这样的选项键:

var optionKeyEventMonitor: Any? // property to store reference to the event monitor

// Add the event monitor
optionKeyEventMonitor = NSEvent.addLocalMonitorForEvents(matching: .flagsChanged) { event in
    if event.modifierFlags.contains(.option) {
        self.button.title = "copy"
        self.button.action = #selector(self.copyButtonClicked(_:))
    } else {
        self.button.title = "delete"
        self.button.action = #selector(self.deleteButtonClicked(_:))
    }  
    return event
}

@IBAction func copyButtonClicked(_ sender: Any) {
    Swift.print("Copy button was clicked!")
}

@IBAction func deleteButtonClicked(_ sender: Any) {
    Swift.print("Delete button was clicked!")
}

记得在完成后删除事件监视器:

deinit {
    if let eventMonitor = optionKeyEventMonitor {
        NSEvent.removeMonitor(eventMonitor)
    }
}

如果您不希望根据选项键状态调用单独的方法,则可以在单击按钮时检查modifierFlags:

@IBAction func buttonClicked(sender: NSButton) {
    if NSEvent.modifierFlags().contains(.option) {
        print("option pressed")
    } else {
        print("option not pressed")
    }
}

-1
投票

在Swift 3代码中:

func optionKeyDown() -> Bool
{
    return NSEvent.modifierFlags().contains(NSEventModifierFlags.option)
}

if optionKeyDown()
{
    print ("do option code")
}
else
{
    print ("do normal code")
}
© www.soinside.com 2019 - 2024. All rights reserved.