【问题标题】:Why is the NSStatusItem displaying multiple times?为什么 NSStatusItem 显示多次?
【发布时间】:2013-12-13 07:24:25
【问题描述】:

一个 NSStatusItem 附加了一个 NSMenu,并且 NSMenu 的按钮之一打开了一个 NSWindow。每当单击其中一个按钮时,窗口都会按预期打开并正常工作,但会打开另一个 NSStatusItem 显示。

NSStatusItem 是一个时钟,所以我可以看到它正在正确更新。但是,克隆的 NSStatusItem 没有自己的菜单。如果我按下使窗口更多次的按钮,则会弹出更多 NSStatusItem 的克隆版本。

除此之外一切正常。

这不是很多信息,但我想不出还有什么可以帮助你的。我很乐意提供更多信息或尝试一下。

编辑:每次单击按钮时,都会以某种方式调用 awakeFromNib,这就是发生另一个半工作 NSStatusItem 的原因。

编辑:临时解决方法是将 awakeFromNib 方法放在 dispatch_once 中。

编辑:添加了单击按钮时触发的方法,如@zpasternack 所建议的那样

- (IBAction)preferences:(id)sender {
    self.windowController = [[NSWindowController alloc] initWithWindowNibName:@"PreferencesWindow"];
    [[self windowController] showWindow:self];
}

【问题讨论】:

  • 您能否发布在单击打开 NSWindow 的按钮时运行的代码?
  • 你去@zpasternack。此外,windowController 在标题中声明,如下所示 @property (strong) NSWindowController *windowController;

标签: macos cocoa duplicates nsstatusitem awakefromnib


【解决方案1】:

PreferencesWindow nib 中是否包含 NSStatusItem?这可以解释它,因为每次单击按钮时都会加载笔尖。

另外,每次单击按钮时您是否需要重新创建该窗口?也许你只能第一次做?

- (IBAction)preferences:(id)sender {
    if( self.windowController == nil ) {
        self.windowController = [[NSWindowController alloc] initWithWindowNibName:@"PreferencesWindow"];
    }
    [[self windowController] showWindow:self];
}

【讨论】:

  • 不,NSStatusItem 不在 PreferencesWindow 中。我有由首选项打开的 PreferencesWindow,然后是 NSStatusItem 所在的 MainMenu.xib。我将阅读awakeFromNib 的实际工作原理,因为如果打开对象拥有的任何 nib,则可以调用它,而不仅仅是 MainMenu
  • "建议您在 File's Owner 对象与其关联的 nib 文件之间保持一一对应关系。加载具有相同 File's Owner 对象的两个 nib 文件会导致调用该对象的 awakeFromNib 方法两次,这可能会导致某些数据结构以不希望的方式重新初始化。” developer.apple.com/library/mac/documentation/cocoa/reference/…
  • 我需要将任何额外的 xib 分离到一个单独的控制器中
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 1970-01-01
相关资源
最近更新 更多