Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Macos 在NSWindow关闭后,ActivateIgnoring其他应用程序和MakeKeyandDerfront不工作_Macos_Cocoa_Nswindow_Nsstoryboard - Fatal编程技术网

Macos 在NSWindow关闭后,ActivateIgnoring其他应用程序和MakeKeyandDerfront不工作

Macos 在NSWindow关闭后,ActivateIgnoring其他应用程序和MakeKeyandDerfront不工作,macos,cocoa,nswindow,nsstoryboard,Macos,Cocoa,Nswindow,Nsstoryboard,我从一个故事板项目开始。我把菜单列在菜单栏上。 单击菜单栏项目时,将在AppDelegate.swift中触发以下方法 func setWindowVisible() { NSApp.activateIgnoringOtherApps(ture) NSApp.mainWindow?.makeKeyAndOrderFront(self) } 这使我的应用程序领先。但是一旦我点击了关闭按钮,窗口上的红色按钮,它就不起作用了 无论我关闭窗口,它都可以在非故事板项目中工作 我已经准备好

我从一个故事板项目开始。我把菜单列在菜单栏上。 单击菜单栏项目时,将在AppDelegate.swift中触发以下方法

func setWindowVisible() {
    NSApp.activateIgnoringOtherApps(ture)
    NSApp.mainWindow?.makeKeyAndOrderFront(self)
}
这使我的应用程序领先。但是一旦我点击了关闭按钮,窗口上的红色按钮,它就不起作用了

无论我关闭窗口,它都可以在非故事板项目中工作

我已经准备好了

NSApp.mainWindow?.releasedWhenClosed = false
在ApplicationIDFinishLaunching()中


有人能帮我吗?

applicationdFinishLaunching
中设置
releasedWhenClosed
无效,因为此时
main window
属性为零。→ 该窗口是在执行此方法后创建的

在Interface Builder中创建窗口时,
releasedWhenClosed
默认为false

关闭窗口后,mainWindow属性可能为nil,因为这样就没有mainWindow了。从文档中:

当应用程序的故事板或nib文件尚未完成加载时,此属性中的值为nil。当应用处于非活动或隐藏状态时,它也可能为零

通过从
NSApp
windows
数组中访问窗口,我可以再次显示窗口(关闭后)

NSApp.activateIgnoringOtherApps(true)
NSApp.windows[0].makeKeyAndOrderFront(self)

如果您有多个窗口,则需要在数组中找到正确的窗口。

要将Kyle KIM的答案拉入自己的答案中,因为上面使用数组访问的解决方案导致我出现异常

在我的用例中,我使用它将应用程序置于前台

我还将此功能与新的SwiftUI应用程序功能一起使用,谢天谢地,所有功能都可以协同工作--即使单击“关闭”按钮,也会再次调用此功能

class AppDelegate: NSObject, NSApplicationDelegate {

var window: NSWindow?

func applicationDidBecomeActive(_ notification: Notification) {
    self.window = NSApp.mainWindow
}

func applicationDidFinishLaunching(_ aNotification: Notification) {
    KeyboardShortcuts.onKeyUp(for: .toggleApp) {
        if !NSApp.isActive || !(self.window?.isKeyWindow ?? false) {
            NSApp.activate(ignoringOtherApps: true)
            self.window?.makeKeyAndOrderFront(self)
        } else {
            print("App already active")
        }
    }
}
}
!!NSApp.isActive和key窗口检查都是必需的,因为当用户单击“close”按钮时,窗口不再是key,而是活动的。该应用程序将保持活动状态,直到他们单击其他应用程序。您可以通过窗口的焦点颜色看到这种情况

请注意,此AppDelegate不是我的应用程序中的主要入口点,它与swiftUI一起使用:

@main
struct MainApp: App {
    @NSApplicationDelegateAdaptor(AppDelegate.self) var appDelegate

    var body: some Scene {...}
}

还是不走运。我有一个xcode模板提供的窗口你能打印windows数组吗?我刚刚解决了。变量窗口:NSWindow!使用此属性,window=NSApp.mainWindow!在applicationIDBECOMEACTIVE()中,然后在我的方法中使用self.window.makeKeyandderFront(self)。但是我不知道window=NSApp.mainWindow的最佳位置是不是!位于ApplicationIDBecMeactive()中。先生,你有什么建议吗?我想只要你只有一扇窗户就可以了。当它更改时,此代码可能会中断。