- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个仅限 NSStatusItem
的小型应用程序,带有设置窗口。从 NSStatusItem
中的菜单中,我想重新激活主窗口。
应用程序保留一个NSWindow
实例,该实例设置为关闭时不释放。关闭窗口后,我将应用程序的激活策略更改为 accessory
,因此 Dock 图标对用户隐藏起来。
当用户重新打开窗口时,我将激活策略更改回常规
并再次显示该窗口。
这是隔离问题的示例应用程序中我的应用程序委托(delegate)的全部内容:
import Cocoa
import SwiftUI
@NSApplicationMain
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
var statusItem: NSStatusItem!
func applicationDidFinishLaunching(_ aNotification: Notification) {
// Create the window and set the content view.
window = NSWindow(
contentRect: NSRect(x: 0, y: 0, width: 480, height: 300),
styleMask: [.titled, .closable, .miniaturizable, .resizable, .fullSizeContentView],
backing: .buffered, defer: false)
window.center()
window.setFrameAutosaveName("Main Window")
window.contentView = NSHostingView(rootView: EmptyView())
window.makeKeyAndOrderFront(nil)
window.isReleasedWhenClosed = false
window.delegate = self
statusItem = NSStatusBar.system.statusItem(withLength: NSStatusItem.squareLength)
statusItem.button?.title = "X"
statusItem.button?.target = self
statusItem.button?.action = #selector(toggleWindow(sender:))
NSApp.setActivationPolicy(.accessory)
}
func applicationWillTerminate(_ aNotification: Notification) {
// Insert code here to tear down your application
}
@objc func toggleWindow(sender: AnyObject) {
if window.isVisible {
window.close()
} else {
window.makeKeyAndOrderFront(nil)
NSApp.activate(ignoringOtherApps: true)
NSApp.setActivationPolicy(.regular)
}
}
}
extension AppDelegate: NSWindowDelegate {
func windowWillClose(_ notification: Notification) {
NSApp.setActivationPolicy(.accessory)
}
}
该应用程序是 Xcode 11 中的默认模板,但我将主视图更改为 EmptyView()
,因此不需要额外的类。
如果我使用信号量按钮关闭窗口,然后使用状态栏图标重新打开它,则效果很好。
但是,如果我通过 CMD-W 关闭它并重新打开它,我会恢复窗口,但菜单仍保持选中状态,就好像之前的关闭命令尚未完成一样。
由于菜单处于这种奇怪的状态,因此应用程序不会响应事件,直到菜单问题得到解决(例如,通过单击另一个菜单项)。
更新:
作为解决方法,我发现如果我在几毫秒后更改激活策略,菜单问题就可以解决:
func windowWillClose(_ notification: Notification) {
DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) {
NSApp.setActivationPolicy(.accessory)
}
}
但是,窗口出现后,它仍然无法正确处理事件(错过了第一次点击)。
最佳答案
以下内容在我的系统上运行正常,并且没有显示有问题的行为;也许我误解了这个问题。这是一个可以在 Xcode 中运行的编程演示;由于某种原因,当脱离命令行运行时,所有菜单都不起作用。
import Cocoa
class AppDelegate: NSObject, NSApplicationDelegate {
var window: NSWindow!
var statusItem: NSStatusItem!
@objc func showMainWindow() {
window.makeKeyAndOrderFront(nil)
}
@objc func hideMainWindow() {
window.orderOut(nil)
}
@objc func myBtnAction(_ sender:AnyObject ) {
NSSound.beep()
}
@objc func myMenuAction(_ sender:AnyObject ) {
NSSound.beep()
}
func buildMenu() {
let mainMenu = NSMenu()
NSApp.mainMenu = mainMenu
// **** App menu **** //
let appMenuItem = NSMenuItem()
mainMenu.addItem(appMenuItem)
let appMenu = NSMenu()
appMenuItem.submenu = appMenu
appMenu.addItem(withTitle: "Quit", action:#selector(NSApplication.terminate), keyEquivalent: "q")
// **** File menu **** //
let fileMenuItem = NSMenuItem()
let fileMenu = NSMenu(title: "File")
fileMenu.addItem(withTitle: "Beep", action:#selector(self.myMenuAction), keyEquivalent: "b")
fileMenuItem.submenu = fileMenu
mainMenu.addItem(fileMenuItem)
}
func buildWnd() {
let _wndW : CGFloat = 400
let _wndH : CGFloat = 300
window = NSWindow(contentRect:NSMakeRect(0,0,_wndW,_wndH),styleMask:[.titled, .miniaturizable, .resizable], backing:.buffered, defer:false)
window.center()
window.title = "Swift Test Window"
// **** TextView **** //
let scrlView = NSScrollView (frame:NSMakeRect( 10, 60, _wndW - 20, _wndH - 70 ))
window.contentView!.addSubview (scrlView)
scrlView.hasVerticalScroller = true
scrlView.autoresizingMask = [.height, .width]
let txtView = NSTextView (frame:NSMakeRect( 0, 0, _wndW - 20, _wndH - 70 ))
txtView.font = NSFont(name:"Menlo Bold", size: 13.0)
scrlView.documentView = txtView
// **** Button **** //
let myBtn = NSButton (frame:NSMakeRect( 150, 15, 95, 30 ))
myBtn.bezelStyle = .rounded
myBtn.autoresizingMask = [.minXMargin,.maxYMargin]
myBtn.title = "Beep"
myBtn.action = #selector(self.myBtnAction(_:))
window.contentView!.addSubview (myBtn)
// **** Quit btn **** //
let quitBtn = NSButton (frame:NSMakeRect( _wndW - 50, 10, 40, 40 ))
quitBtn.bezelStyle = .circular
quitBtn.autoresizingMask = [.minXMargin,.maxYMargin]
quitBtn.title = "Q"
quitBtn.action = #selector(NSApplication.terminate)
window.contentView!.addSubview(quitBtn)
}
func applicationDidFinishLaunching(_ aNotification: Notification) {
buildMenu()
buildWnd()
statusItem = NSStatusBar.system.statusItem(withLength: 100)
statusItem.button!.title = "foobar"
let menu = NSMenu()
let showMenuItem = NSMenuItem(title: "Show Window", action:#selector(self.showMainWindow), keyEquivalent: "")
menu.addItem(showMenuItem)
let hideMenuItem = NSMenuItem(title: "Hide Window", action:#selector(self.hideMainWindow), keyEquivalent: "")
menu.addItem(hideMenuItem)
menu.addItem(.separator())
menu.addItem(withTitle: "Quit", action:#selector(NSApplication.terminate), keyEquivalent: "q")
statusItem.menu = menu
}
}
let appDelegate = AppDelegate()
// **** main.swift **** //
let app = NSApplication.shared
app.setActivationPolicy(.regular)
app.delegate = appDelegate
app.activate(ignoringOtherApps:true)
app.run()
要在 Xcode 中运行,请创建一个 Swift 应用程序并添加一个 main.swift 文件(文件/新建/文件)。将导入 Foundation 更改为导入 Cocoa。从演示中复制/粘贴 main.swift 代码。完全删除旧的 AppDelegate 并复制/粘贴演示的 AppDelegate。点击运行。应该能够从状态栏中显示/隐藏主窗口。 TextView 始终将焦点保持在我的系统上。没有尝试过使用 xib。
关于macos - 从 NSStatusItem 显示主窗口时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61721352/
我是一名 .Net 开发人员,需要将一个小程序移植到 Mac OS X。我已经完成了大部分工作(部分感谢此网站上的人员,谢谢!),但有一个错误,也许我可以得到帮助与。 我正在创建一个位于状态栏中的工具
我正在开发一个在 Mac OS 状态栏中带有图标的应用程序。 我添加我的图标: self.statusItem = [[NSStatusBar systemStatusBar] statusItemW
我在 NSStatusItem 对象中有一个自定义 View 。该 View 显示图标。它还可以显示进度,但您必须调用 [self.statusitemview setProgressValue:th
我有一个 NSStatusItem,我想通过右键单击该项目来弹出一个菜单。我对 NSView 进行了子类化并覆盖了 - (void)rightMouseDown:(NSEvent *)event 方法
我在启动时显示一个 statusItem,如下所示: theItem = [[[NSStatusBar systemStatusBar] statusItemWithLength:NSVariable
我正在考虑一个想法,基本上我想要一个带有 NSPopoverController 的 NSStatusItem 。我读到了人们遇到的所有问题,但我只是想尝试一下。现在有干净的方法吗?我见过的所有版本都
我是一名 .Net 开发人员,需要将一个小项目移植到 Mac 中,所以我对 Objective C 几乎一无所知。事实上,下面的代码只是一堆捕获救命稻草和在黑暗中拍摄的代码。 尝试构建一个状态菜单程序
我使用黑色和透明的 PNG 创建状态项。我看到许多应用程序在突出显示时将颜色图标更改为白色(默认为蓝色背景),我想知道这个过程是自动的还是我必须调用 setAlternateImage 来手动更改它。
你们都知道 Mac OS X 中的菜单栏(或者更好地说 NSStatusBar)。 有些元素我可以移动,有些则不能。 我希望能够拖动我的应用程序的 NSStatusItem。 知道如何实现这个吗? 最
我有一个可变长度的NSStatusItem,我希望尽可能保持可见,即使这意味着只显示部分内容,但当我的项目足够宽以运行到应用程序的菜单栏,它完全隐藏。有没有办法知道何时发生这种情况,以便我可以缩小 V
我正在为 OS X 编写一个状态栏应用程序,我想在等待下载文件时使用动画“正在加载”gif 作为图标。 将 NSImage 中的 gif 传递给 NSStatusItem 的 setImage: 方法
我有一个带有附加菜单的 NSStatusItem,我使用全局热键触发该菜单。如果我单击菜单项,我会像平常一样突出显示,如果我使用热键,则不会触发突出显示。有谁知道触发高亮的方法吗? 我尝试过重写 Vi
我的菜单栏应用程序如何实现与 1Password 或 Dropbox 相同的行为: 单击他们的菜单栏图标或弹出框不会窃取焦点,例如例如,当我在 TextEdit 中并打开 1Password/Drop
我在名为 StatusMenuController 的类中创建一个 NSStatusItem,如下所示 class StatusMenuController: NSObject { let statu
可以将 NSStatusItem 的 behaviour 属性设置为 removalAllowed (NSStatusItemBehaviorRemovalAllowed)然后,用户可以使用拖放操作从
首先:我是 Swift 开发的新手。 我正在使用 this 教程制作一个弹出窗口,当我点击我的顶部栏图标时会出现该弹出窗口。 所以我的 AppDelehgate 代码是: func applicati
我已经为我的应用程序创建了一个 NSStatusItem,但希望它在使用 Control+F8 (Control+fn+f8) 时可以导航,就像系统项一样。 状态项在导航序列中被莫名其妙地跳过了。是否
我正在制作一个状态栏应用程序,它在单击 NSStatusItem 时显示 NSPopover,如下所示: 我添加了通过拖动边缘来调整弹出窗口大小的功能,方法是像这样子类化弹出窗口的 View : cl
我有一个仅限 NSStatusItem 的小型应用程序,带有设置窗口。从 NSStatusItem 中的菜单中,我想重新激活主窗口。 应用程序保留一个NSWindow实例,该实例设置为关闭时不释放。关
我有一个 OSX 应用程序,除了 NSStatusBar 中显示的图标之外,它还有自己的窗口。 NSStatusBar 的原因是使应用程序能够在主窗口关闭时在后台运行。当尝试单击状态栏图标时,我必须单
我是一名优秀的程序员,十分优秀!