我有一个状态栏应用程序,该应用在状态栏中显示一个绿色圆圈,每10秒与红色圆圈交替。它通过使用item.view = icon1;
和item.view = icon2;
来更改图像来做到这一点。这样的初始化:
let item = NSStatusBar.systemStatusBar().statusItemWithLength(-1);
self.icon1 = IconView(imageName: "icon1", item: item);
self.icon2 = IconView(imageName: "icon2", item: item);
单击绿色或红色圆圈时,我已经制作的一些设置的弹出视图看起来不错。
当item.view
更改为红色或绿色时,问题是在每个10秒间隔,弹出视图关闭并要求用户再次单击绿色或红色按钮以显示它。
我如何使弹出窗口持续存在,但状态栏图像更改,只有在用户再次单击红色或绿色按钮后才消失?
这是我的awakeFromNib()
,用于弹出视图:
override func awakeFromNib()
{
let edge = NSMinYEdge
let icon = self.icon
let icon2 = self.icon2
let icon3 = self.icon3
let rect = icon.frame
let rect2 = icon2.frame
let rect3 = icon3.frame
icon.onMouseDown = {
if (icon.isSelected)
{
self.popover?.showRelativeToRect(rect, ofView: icon, preferredEdge: edge);
return
}
self.popover?.close()
}
icon2.onMouseDown = {
if (icon2.isSelected)
{
self.popover?.showRelativeToRect(rect2, ofView: icon2, preferredEdge: edge);
return
}
self.popover?.close()
}
icon3.onMouseDown = {
if (icon3.isSelected)
{
self.popover?.showRelativeToRect(rect3, ofView: icon3, preferredEdge: edge);
return
}
self.popover?.close()
}
}
}
您将附加的弹出声附加到视图中,该视图将从视图层次结构中删除。而不是每次使用单个视图将新视图分配给NSStatusItem
,然后更改其属性以显示不同的状态(即更改其image
属性)。
另外,您可以创建一个空的NSView
并将其分配给NSStatusItem
视图属性。然后,您可以根据需要在该视图中添加并显示图标。确保将弹出窗口连接到这个空视图而不是单个图标。
在popover类dealloc
方法中放一个断点以查看堆栈跟踪。您会发现为什么从堆栈跟踪发生这种情况。