【问题标题】:How to use NSToolBar in Xcode 6 and Storyboard?如何在 Xcode 6 和 Storyboard 中使用 NSToolBar?
【发布时间】:2014-08-04 20:19:17
【问题描述】:

我一直在尝试构建一个在 Xcode 6 中使用 Swift 和 Storyboard 的 Cocoa 应用程序,但我如何在那里使用 NSToolbar

在 Xcode 5 和 xib 中,您可以将对象库中的 NSToolbar 添加到任何 .xib 文件中,然后单击添加的工具栏以将其展开并将连接从那里的任何项目拖放到 AppDelegate.h 文件.通过这种方式,您可以创建IBActionIBOutlet 连接。我确认如果您在 Xcode 6 中使用 Swift 和非故事板,也可以做到这一点。但是,在 Xcode 6 和 Storyboard 环境中似乎并非如此。

我首先在 Xcode 6 中创建了一个使用 Storyboard 的项目,但后来我无法将对象库中的 NSToolbar 添加到 Storyboard 中的视图控制器中。所以我将它添加到 Storyboard 中的 Window Controller 的 Window 对象中。但是,通过这种方式,我无法创建从扩展工具栏中的任何项目到 AppDelegate.swiftViewController.swift 的连接。

所以我的问题是:

  • 创建一个使用NSToolbar的故事板应用是否可行?
  • 如果可行,将NSToolbar 添加到窗口控制器是否是在情节提要中使用NSToolBar 的正确方法?
  • 最后,如何在此处创建@IBOutlet@IBAction 连接?

更新

我发现@GeorgeVillasboas 接受的答案仅适用于@IBAction。我还在寻找如何创建@IBOutlet 连接...

【问题讨论】:

  • 看看我的回答...

标签: xcode cocoa swift storyboard nstoolbar


【解决方案1】:

我遇到了同样的问题。 该解决方案适用于 Objective-C 和 Swift 项目。

在 OSX 上使用 Storyboards 时,它会创建一个 NSWindow 的实例并作为它的 Window Content Segue 连接到另一个 NSViewController,如您所描述的。

在您的 ViewController 上,创建一个标准 IBAction 以在单击工具栏时接收操作。要将它与 NSToolbar 连接起来,只需从 NSToolbarItem 按住 control 并拖动(或左键拖动)到 FirstResponder 对象,如下图所示。

这将打开一个可用连接的巨大列表。您的 IBAction 将在该列表中。 只需选择它,您就可以开始了。

希望这会有所帮助!

【讨论】:

  • @Gardecolo 您是否设法将您的 ViewController 作为您的 NSWindow 的委托?在这里,我用 Swift 编译了一个简单且有效的示例。你应该能够让它与它一起工作。希望能帮助到你。最好的。 G. - github.com/ghvillasboas/SimpleNSToolbarWire
  • 你说得对,问题在于没有采用NSWindowDelegatewindow.delegate = self。这适用于自定义工具栏项目,但不适用于颜色或字体工具栏项目,仅供参考。但我不需要它,所以没问题。谢谢你的礼貌。
  • @GeorgeVillasboas IBOutlets 怎么样?找不到连接方式。
  • Apple 需要进行烧烤并邀请 Cocoa 和 Cocoa Touch 团队,这样他们才能最终见面并相互了解,并开始为 OSX 和 iOS 创建一套统一的控件和 API!顺便说一句,与 iOS 相比,Cocoa 更加复杂和问题多多。现在是 Cocoa 团队从 Cocoa Touch 复制 API 的时候了。苹果,我在看着你!
  • @Abin 查看这个示例项目。希望能帮助到你。 github.com/ghvillasboas/SimpleNSToolbarWire
【解决方案2】:

这里是出口和行动的一般解决方案。它允许您执行与 iboutlet 用于工具栏项的所有相同功能,还允许您将按钮设置为功能而不是创建 ibaction。希望对你有帮助:P

override func viewDidLayout() {
var x = self.view.window?.toolbar?.items[1].label
println(x)
if(self.view.window?.toolbar?.items[0].label! != "Check")
{
    toobarediting()
}
println("didlay")
}

func toobarediting() {
self.view.window?.toolbar?.insertItemWithItemIdentifier("Check", atIndex: 0)
}

func toolbarcheck(functiontoset: Selector) {
var y = self.view.window?.toolbar?.items[0] as NSToolbarItem
y.action = functiontoset
if(functiontoset != nil)
{
    y.enabled = true
}
}

这是我的问题的链接,试图获得更清晰的答案 http://www.stackoverflow.com/questions/27371439/use-nstoolbar-outlet-xcode-6-and-storyboard/27374449 但从我目前得到的答案看来,这是最好的选择。

【讨论】:

    【解决方案3】:

    IBOutlets 的同样问题也适用于 KVO。 NSSplitViewController 的特性之一是支持 KVO 的每个拆分视图项的 canCollapse 属性,但这在 IB 中无法使用,就像 IBOutlets 一样。

    我能看到的唯一解决方法是为每个场景添加一个 NSObjectController,当场景加载时,将对象控制器的对象设置为您想要引用的另一个场景(已经加载)中的对象。

    【讨论】:

      【解决方案4】:

      这有助于我找到您正在寻找的 IBOutlet 解决方案: https://stackoverflow.com/a/27555237/3398062

      更新(说明)

      我发现这个线程是因为我试图在工具栏内创建一个循环进度指示器,但我不知道如何从 ViewController 对其进行动画处理,因为 IBOutlet 是在自定义 WindowController 中声明的。

      最后,我找到了我在上面添加的帖子,其中描述了如何从其他类访问 IBOutlets。

      本质上我所做的如下:

      • 为窗口控制器创建一个自定义的 NSWindowController 子类 (CustomWindowController),这样我就可以为 ProgressIndicator 添加 IBOutlet:

      代码示例:

      @interface CustomWindowController : NSWindowController
      
      @property (weak) IBOutlet NSProgressIndicator *progressIndicator;
      
      @end
      
      • 然后在 ViewController 类中,在我想用来更新进度指示器状态的方法中,创建自定义窗口控制器的对象。

      代码示例:

      CustomWindowController *customWindowController = self.view.window.windowController;`
      
      • 最后,要更改进度指示器的状态,只需从创建的自定义对象中调用方法即可。

      代码示例:

      [customWindowController.progressIndicator startAnimation:sender];
      

      [customWindowController.progressIndicator stopAnimation:sender];
      

      【讨论】:

      • 虽然此链接可能是解决问题的方法,但您应该添加更多详细信息
      【解决方案5】:

      这是一个不依赖于运行时连接的答案-@cdalvaro 的答案在某些应用程序中得到了大部分的解决,但并不完整,它需要 ViewController 了解人工 @987654321 @,感觉不对。

      与@cdalvaro 一样,第一步是构建您自己的NSWindowController 子类,并将Storyboard WC 设置为该类。然后,您可以在新的 WindowController 中创建与 NSToolbar@IBOutlets 和 @IBActions)的所有连接。到目前为止一切顺利。

      最后一步,我在其他任何地方都没有看到,是如何在 WindowController 中引用 ViewController - 你不能为它创建一个 @IBOutlet - 原因与我们第一次到达这里的原因相同place - 您不能在情节提要中创建跨场景的引用。但是,WindowController 必须具有对 ViewController 的引用,并且确实... self.window!.contentViewController! as! ViewController

      这是一个完整的 WindowController,带有一个复选框,可以在 ViewController 中设置值,ViewController 不必知道任何事情...

      class MyWindowController: NSWindowController {
      
          var viewController: ViewController {
              get {
                  return self.window!.contentViewController! as! ViewController
              }
          }
      
          @IBOutlet weak var aSwitch: NSButton!
          @IBAction func toolbarActionA(sender: AnyObject) {
              println("toolbarActionA")
              self.viewController.a = !self.viewController.a
              self.aSwitch.state = self.viewController.a ? NSOnState : NSOffState
          }
      }
      

      【讨论】:

        【解决方案6】:

        该视频帮助我如何在不编写任何代码的情况下创建工具栏:https://www.youtube.com/watch?v=XSQocHG3IjA

        您可以从对象库中添加“窗口控制器”项目(如果您没有),连接到视图控制器(您希望工具栏显示的位置)并观看视频!对于自定义工具栏按钮,只需从对象库中拖动即可将“图像按钮”项目添加到工具栏。然后你可以选择一个按钮的图像,设置大小等等......

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2014-09-03
          • 2014-11-03
          • 1970-01-01
          • 2015-01-20
          • 2014-10-16
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多