Hello:
Since the beginning of March, I have been trying to respond to a demand by Apple without success:
The requirement is that when a user closes the main window of my app by clicking on the red x, I must they must be able to relaunch the main window from a menu.
I have been able to hide the window and relaunch it beu am unable to relaunch the window when the red x is clicked, EVEN THOUGH THE APP ICON IS STILL ON THE DOCK.
I hope someone can point me in the right direction. Here is my code: (I'm sure I have stuff here I don't need. Would appreciate to know which lines to cut.
import Cocoa
import ServiceManagement
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
@IBOutlet weak var showMainMenu: NSMenu!
var window: NSWindow!
var statusBarItem: NSStatusItem?
func applicationDidFinishLaunching(_ aNotification: Notification) {
window = NSApplication.shared.windows[0]
let statusBar = NSStatusBar.system
statusBarItem = statusBar.statusItem(
withLength: NSStatusItem.squareLength)
let itemImage = NSImage(named: "SMR_icon")
itemImage?.isTemplate = true
statusBarItem?.button?.image = itemImage
statusBarItem?.button?.action = #selector(self.statusBarButtonClicked(sender:))
statusBarItem?.button?.sendAction(on: [.leftMouseUp, .rightMouseUp]) // << send action in both cases
let statusBarMenu = NSMenu(title: "Status Bar Menu")
statusBarMenu.addItem(
withTitle: "Launch ScorCent Master Review",
action: #selector(AppDelegate.LaunchScorCentMasterReview),
keyEquivalent: "")
statusBarMenu.addItem(
withTitle: "Quit ScorCent Master Review",
action: #selector(AppDelegate.QuitScorCentMasterReview),
keyEquivalent: "")
statusBarMenu.addItem(
withTitle: "Terminate ScorCent Master Review",
action: #selector(AppDelegate.StopScorCentMasterReviewApplication),
keyEquivalent: "")
// Setting menu
statusBarItem?.button?.menu = statusBarMenu // << store menu in button, not item
}
@IBAction func LaunchWindowMain(_ sender: NSMenuItem) {
func applicationShouldHandleReopen(theApplication: NSApplication, hasVisibleWindows flag: Bool) -> Bool {
if !flag{
window.makeKeyAndOrderFront(nil)
for window: AnyObject in theApplication.windows {
window.makeKeyAndOrderFront(self)
}
}
return true
}
}
@objc func statusBarButtonClicked(sender: NSStatusBarButton) {
let event = NSApp.currentEvent!
if event.type == NSEvent.EventType.leftMouseUp {
print("Left click!")
if let button = statusBarItem?.button { // << pop up menu programmatically
button.menu?.popUp(positioning: nil, at: CGPoint(x: -1, y: button.bounds.maxY + 5), in: button)
}
} else {
print("Left click!")
}
}
@objc func QuitScorCentMasterReview(_ sender: Any?) {
NSApplication.shared.hide(QuitScorCentMasterReview)
print("Close the App")
}
@objc func LaunchScorCentMasterReview(_ sender: NSStatusBarButton) {
NSApplication.shared.unhide(AppDelegate.LaunchScorCentMasterReview)
NSApplication.shared.unhide(AppDelegate.init())
print("Launch the App")
}
@objc func StopScorCentMasterReviewApplication(_sender: Any?) {
NSApplication.shared.terminate(AppDelegate.StopScorCentMasterReviewApplication)
print("Stop the App")
}
func applicationWillTerminate(_ aNotification: Notification) {
}