簡體   English   中英

從 cocoa 應用程序單擊菜單時如何處理 window 的關閉操作並具有 Window 的單個實例

[英]How to handle close action of window and have single instance of Window when clicked on menu from cocoa app

我使用菜單項以編程方式創建了 cocoa 應用程序。 當我單擊第一個菜單項時,它應該打開一個 window 並且我只想擁有一個 window 實例,這意味着即使我反復單擊第一個菜單項,它也應該激活我當前的 window。 我還想處理 window 的關閉按鈕操作。 當我關閉它並再次嘗試單擊第一個菜單項時,我的應用程序崩潰了。

下面是我的代碼 n AppDelegate:

import Cocoa

class AppDelegate: NSObject, NSApplicationDelegate {
    
    
    
    var statusItem: NSStatusItem!
    lazy var window: NSWindow = NSWindow(
        contentRect: NSRect(x: 0, y: 0, width: 550, height: 300),
        styleMask: [.miniaturizable, .closable, .titled],
        backing: .buffered, defer: false)
    let myViewController = ViewController()
    func applicationDidFinishLaunching(_ aNotification: Notification) {
        statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.variableLength)
        if let button = statusItem.button {
            button.image = NSImage(systemSymbolName: "1.circle", accessibilityDescription: "1")
        }
        
        setupMenus()
        
    }
    
    func setupMenus() {
        // 1
        let menu = NSMenu()
        
        // 2
        let one = NSMenuItem(title: "Open Network Share Url's", action: #selector(didTapOne) , keyEquivalent: "1")
        menu.addItem(one)
        
        
        let two = NSMenuItem(title: "Reconnect", action: #selector(didTapTwo) , keyEquivalent: "2")
        menu.addItem(two)
        
        menu.addItem(NSMenuItem.separator())
        
        menu.addItem(NSMenuItem(title: "Quit", action: #selector(NSApplication.terminate(_:)), keyEquivalent: "q"))
        
        // 3
        statusItem.menu = menu
    }
    
    private func changeStatusBarButton(number: Int) {
        if let button = statusItem.button {
            button.image = NSImage(systemSymbolName: "\(number).circle", accessibilityDescription: number.description)
        }
    }
    
    @objc func didTapOne() {
        changeStatusBarButton(number: 1)
        window.center()
        window.title = "Open Network Share Url's"
        window.makeKeyAndOrderFront(nil)
        window.contentViewController = myViewController
        NSApp.activate(ignoringOtherApps: true)
    }
    @objc func didTapTwo() {
        changeStatusBarButton(number: 2)
        
    }

}

這解決了我的問題

 if window == nil {
            window = NSWindow(
                      contentRect: NSRect(x: 0, y: 0, width: 550, height: 300),
                      styleMask: [.miniaturizable, .closable, .titled],
                      backing: .buffered, defer: false)
                window?.center()
                window?.title = "Open Network Share Url's"
                window?.contentViewController = myViewController
                window?.isReleasedWhenClosed = false
                window?.makeKeyAndOrderFront(self)
             
                  
            } else {
                window?.makeKeyAndOrderFront(self)
            }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM