【问题标题】:Adding a custom view to toolbar将自定义视图添加到工具栏
【发布时间】:2011-06-27 20:24:54
【问题描述】:

我现在用 Cocoa 挣扎了 2 个小时,但没有成功。我想向工具栏添加自定义视图。因此,我在窗口中添加了一个 NSToolbar(使用 IB),并添加了我的视图(效果很好)。 IB 自动创建了一个 NSToolbarItem。 我在这里按照 Apple 的说明进行操作:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Toolbars/Tasks/AddRemoveToolbarItems.html#//apple_ref/doc/uid/20000755-BBCGJCDJ

问题是我现在不知道该怎么做,虽然它的标签显示在窗口中,但视图没有显示。

这是我用来绘制的代码(很简单,只是为了测试)

- (void)drawRect:(NSRect)dirtyRect {
    [[NSColor blackColor] set];
    [[NSBezierPath bezierPathWithRect:self.bounds] fill];
}

有人可以帮我吗?

提前致谢。

【问题讨论】:

  • 您可能需要发布用于创建和维护视图的代码。文档中的代码在几年前复制/粘贴并针对我自己的应用程序进行调整时对我有用,因此除非您按原样 100% 使用它,否则您的自定义代码可能存在问题。 :-)
  • 我更新了我的帖子。我想自从我使用 IB 以来,没有什么可写的了。我说的对吗?

标签: cocoa nsview nstoolbar nstoolbaritem


【解决方案1】:

我解决了这个问题。

我将自定义视图放在笔尖的根目录中。我添加了一个经典的 NSToolbarItem 并创建了两个插座:一个用于自定义视图,一个用于 NSToolbarItem。在-(void)awakeFromNib 上,我使用自定义视图调用了NSToolbarItem 上的setView:

根据互联网上的一些资源,这是 Interface Builder 的一个错误。

【讨论】:

  • 谢谢,Xcode确实有一些bug,在4.2版本还是有问题。
  • 当您将 NSView 拖到 IB 中的工具栏时,它会自动创建一个 NSToolbarItem 来保存该视图,您已经有了一个 NSToolbarItem,您所需要的只是以编程方式调用 NSToolbarItem 上的 setView,而不仅仅是设置您的自定义在 IB 中查看(可能是 xib 解包方式的错误)
【解决方案2】:

根据http://www.mail-archive.com/cocoa-dev@lists.apple.com/msg35673.html 讨论中的一位 Apple 工程师的说法,Interface Builder 中存在一个错误,即“自定义视图”(在 IB 中创建的 NSView)在用作 NSToolbarItem 的视图时未正确解码,因此也是如此不会出现在工具栏中。其他类型的 NSView,例如 NSButtons 和 NSBoxes,也可以作为工具栏项正常工作:您可以在 Interface Builder 中创建它们,然后将它们拖到工具栏中以使其成为工具栏项。

(上面链接中的讨论暗示该错误归结为如何在运行时从 XIB 创建“自定义视图”:使用 initWithFrame: 而不是 initWithCoder:。讨论可以追溯到 2009 年,但这仍然没有从 XCode 4.5/OS X 10.8 开始修复。)

在我的例子中,我使用常规 NSView 来包装一组控件(音量滑块和最小/最大按钮),而不是实现自定义 NSView 子类。我可以通过使用 NSBox 而不是 NSView 作为容器来避免这个问题:我使 NSBox 透明、无标题和无边界,因此它的行为与普通的 NSView 包装器完全一样。这在 IB 中需要做更多的工作,但省去了以编程方式将视图连接到工具栏项的麻烦。

【讨论】:

  • 我发现 NSBox 几乎总是比用于 IB 的普通 NSView 更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多