¿Cómo usar NSToolBar en Xcode 6 y Storyboard?

He intentado construir sobre una aplicación Cocoa que usa Swift y Storyboard en Xcode 6, pero ¿cómo puedo usar NSToolbar allí?

En Xcode 5 y xib, puede agregar NSToolbar desde dentro de la Biblioteca de objetos a cualquier archivo .xib y luego hacer clic en la barra de herramientas agregada para expandirlo y arrastrar y soltar una conexión de cualquier elemento a un archivo AppDelegate.h . De esta forma, puede crear una conexión IBAction o IBOutlet . Confirmé que esto también se puede hacer si usa Swift y no storyboard en Xcode 6. Sin embargo, parece que este no es el caso en el entorno de Xcode 6 y Storyboard.

Primero creé un proyecto que usa Storyboard en Xcode 6, pero luego, no pude agregar una NSToolbar desde Object Library a View Controller en Storyboard. Así que lo agregué al objeto Window Window Controller en Storyboard. Sin embargo, de esta manera no puedo crear esas conexiones desde ningún elemento en la barra de herramientas expandida a AppDelegate.swift o ViewController.swift .

Entonces mi pregunta es:

  • ¿Es factible crear una aplicación de guión gráfico que use NSToolbar ?
  • Si es factible, ¿es la adición de NSToolbar al Controlador de Ventana la forma correcta de usar NSToolBar en Storyboard?
  • Finalmente, ¿cómo puedo crear @IBOutlet y @IBAction allí?

ACTUALIZAR

Descubrí que la respuesta aceptada por @GeorgeVillasboas solo funciona para @IBAction . Todavía estoy buscando cómo crear una conexión @IBOutlet

Tuve este mismo problema. La solución funciona tanto para proyectos Objective-C como Swift.

Al trabajar con Storyboards en OSX, crea una instancia de NSWindow y pasa a otro NSViewController como Segue de contenido de la ventana, como usted describió.

En su ViewController, cree un IBAction estándar para recibir la acción cuando se haga clic en la barra de herramientas. Para conectarlo con NSToolbar, simplemente mantenga presionada la tecla control (o haga clic con el botón izquierdo y arrastre) desde su NSToolbarItem al objeto FirstResponder, como se muestra en la imagen a continuación.

Conexión de una NSToolbar en XCode 6

Esto abrirá una ENORME lista de conexiones disponibles. Su IBAction estará en esa lista. Simplemente lo seleccionaste y estás listo para irte.

¡Espero que esto ayude!

Aquí hay una respuesta que no depende de las conexiones en tiempo de ejecución: la respuesta de @ cdalvaro se lleva a cabo casi todo el camino para algunas aplicaciones, pero no está completa, y requiere que ViewController conozca el NSWindowController artificial, que no funciona. me siento bien

Al igual que @cdalvaro, el primer paso es construir su propia subclase de NSWindowController y establecer el WC Storyboard en esa clase. A continuación, puede crear todas sus conexiones hacia y desde NSToolbar (tanto @IBOutlet s & @IBAction s) en el nuevo WindowController. Hasta aquí todo bien.

El último paso, que no he visto en ningún otro lado, es cómo hacer referencia al ViewController en el WindowController; no se puede crear un @IBOutlet en él, por las mismas razones por las que llegamos aquí en primer lugar, se puede No cree referencias entre las escenas en el guión gráfico. Sin embargo, WindowController debe tener una referencia al ViewController, y lo hace … self.window!.contentViewController! as! ViewController self.window!.contentViewController! as! ViewController

Aquí hay un WindowController completo con una checkbox que establece valores en ViewController, sin que ViewController tenga que saber nada

 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 } } 

Esto me ayudó a encontrar la solución IBOutlet que está buscando: https://stackoverflow.com/a/27555237/3398062

Actualización (explicación)

Descubrí este hilo porque estaba intentando crear un indicador de progreso circular dentro de la barra de herramientas y no sabía cómo animarlo desde ViewController ya que IBOutlet fue declarado dentro de un WindowController personalizado.

Finalmente, encontré la publicación que he agregado arriba que describe cómo acceder a IBOutlets de otras clases.

En esencia, lo que he hecho es lo siguiente:

  • Cree una subclase NSWindowController personalizada (CustomWindowController) para Window Controller para que pueda agregar IBOutlet para ProgressIndicator:

Ejemplo de código:

 @interface CustomWindowController : NSWindowController @property (weak) IBOutlet NSProgressIndicator *progressIndicator; @end 
  • Luego, en la clase ViewController, en el método que deseo usar para actualizar el estado del indicador de progreso, creo y objeta el controlador de ventana personalizado.

Ejemplo de código:

 CustomWindowController *customWindowController = self.view.window.windowController;` 
  • Finalmente, para cambiar el estado del indicador de progreso solo hay que llamar al método desde el objeto personalizado creado.

Ejemplo de código:

 [customWindowController.progressIndicator startAnimation:sender]; 

o

 [customWindowController.progressIndicator stopAnimation:sender]; 

Este video me ayudó a crear una barra de herramientas sin escribir una sola línea de código: https://www.youtube.com/watch?v=XSQocHG3IjA

Puede agregar el elemento ‘Controlador de ventana’ de la Biblioteca de objetos (si no tiene uno), conéctese a un Controlador de vista (donde desea que se muestre su barra de herramientas) y siga el video. Para los botones personalizados de la Barra de herramientas, agregue el elemento ‘Botón de imagen’ a la Barra de herramientas simplemente arrastrando desde la Biblioteca de objetos. Luego puedes elegir una imagen para un botón, establecer el tamaño y así sucesivamente …

Aquí hay una solución general para los puntos de venta y las acciones. le permite realizar todas las mismas funciones que un iboutlet para un elemento de barra de herramientas y también le permite configurar el botón para una función en lugar de crear una acción. Espero que ayude: 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 } } 

Aquí hay un enlace a mi pregunta tratando de obtener una respuesta más limpia http://www.stackoverflow.com/questions/27371439/use-nstoolbar-outlet-xcode-6-and-storyboard/27374449 pero parece que a partir de las respuestas que Han llegado hasta ahora esta es la mejor opción.

El mismo problema de IBOutlets también se aplica a KVO. Una de las características de NSSplitViewController es la propiedad canCollapse para cada elemento de vista dividida que admite KVO, pero esto no se puede usar en IB al igual que IBOutlets.

La única solución que puedo ver es agregar un NSObjectController a cada escena y, cuando se cargue la escena, establezca el objeto del controlador del objeto al objeto en la otra escena (ya cargada) a la que desea hacer referencia.