在所有打开的 NSDocuments 中触发 IBAction

Trigger IBAction in all open NSDocuments

我正在更改图层背景颜色、字体颜色等各种内容。当我的用户单击文档中的按钮时,该过程从视图控制器(如下所示)中的 IBAction 开始 window。目前这有效,但只影响我的 OS 基于 X 文档的应用程序中的活动 window。

如果有多个文档 windows 同时打开,我希望更改影响所有打开的 windows,而不仅仅是活动的。

它只影响当前重新启动应用程序后的所有windows。

感谢接受以下回答:

在 window 控制器中添加:

    @IBAction func themeButtonClicked(sender: AnyObject) {
        var thetag = sender.tag()
        NSNotificationCenter.defaultCenter().postNotificationName("updateTheme", object: nil, userInfo: ["tag": thetag])
    }

    override func windowDidLoad() {
        super.windowDidLoad()
        NSNotificationCenter.defaultCenter().addObserver(self, selector: "handleNotification:", name: "updateTheme", object: nil)
    }

    func handleNotification(notification:NSNotification){
        let userInfo:Dictionary<String,Int!> = notification.userInfo as Dictionary<String,Int!>
        let thetag:Int = userInfo["tag"]!
        switch thetag {
        case 0 :
            theCurrentTheme = "white"
            Defaults["theme"] = "white"
        case 1 :
            theCurrentTheme = "cream"
            Defaults["theme"] = "cream"
        case 2 :
            theCurrentTheme = "black"
            Defaults["theme"] = "black"
        default:
            theCurrentTheme = "white"
            Defaults["theme"] = "white"
        }
    }

我认为,如果您想让更改对任何打开的文档可用,并且触发方不知道打开了哪些文档或有多少文档,您应该 post 一个 NSNotification ,并让感兴趣的各方收听(注册)。

因此,除了 window 控制器执行更改作为对其按钮 IBAction 的响应之外,他们还可以注册通知(最终 post window 控制器的另一个实例)并执行与按下按钮时完全相同的操作。

附录:您应该只从通知处理程序和[=11]中调用执行更改的实际方法 =] 你应该只 post 通知。否则,触发操作的 window 控制器将执行两次更改 !

...这意味着,您不再需要一个单独的私有方法(它仅从一个地方调用),而是可以在通知处理程序中编写更改逻辑。