我有一个包含多个ViewControllers的应用程序,我需要在AppDelegate中检查当前哪个ViewController处于活动状态。例如,我将创建一个运行函数的计时器,该函数检查特定的ViewController是否处于活动状态,如果是,则执行一些操作。有没有办法做到这一点?
答案 0 :(得分:2)
NSApplication.sharedApplication().keyWindow
将返回具有键盘访问权限的当前窗口。从那里你可以反省NSWindow对象来确定它是什么。
此外,如果您需要以编程方式激活窗口。
NSApplication.sharedApplication().windows
将在您当前打开的应用程序中返回一组NSWindows。
window.makeKeyAndOrderFront(sender)
即使从最小化开始,也会使窗口成为焦点,并使其成为键盘控制的关键窗口。
window.makeKeyWindow()
只需将窗口置于焦点并使其成为关键窗口。它不会使它最小化。
答案 1 :(得分:1)
您可以通过访问AppDelegate中的根视图控制器或其他任何位置来获取此信息:
let activeController = window.rootViewController
但是,由于您希望使用计时器在该视图控制器中执行某些代码,因此最好发送NSNotification。由于“活动”视图控制器应该知道它处于活动状态,因此您可以专门连接和断开通知侦听器。
答案 2 :(得分:0)
我在AppDelegate中使用此模式来查看哪个视图控制器具有我正在处理的文档:
var vc: ViewController? = nil
func iHaveFocus() -> Bool {
let win = NSApplication.shared.keyWindow
if (win != nil) {
vc = win!.contentViewController as? ViewController
if (vc != nil) {
return true
}
} else {
vc = nil
}
return false
}
// Then to see which document gets something like a paste...
@IBAction func pasteStuff(_ sender: Any) {
if (iHaveFocus()) {
vc!.pasteStuff()
}
}