xcode macos swift nswindow

xcode - ¿Cómo crear una ventana de deslizamiento modal en Mac OS?



macos swift (2)

Versión Objective-C:

- (IBAction)displaySheet:(id)sender { NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle: nil]; NSViewController * vc = [storyboard instantiateControllerWithIdentifier:@"SheetViewController"]; [self presentViewControllerAsSheet:vc];}

¿Cómo puedo crear una ventana / vista de deslizamiento modal en "in-window" en XCode como en esta captura de pantalla?

He intentado crear un nuevo controlador de Windows con la animación "Estilo de panel de autenticación", pero estoy recibiendo solo bloqueos de XCode.


Ese tipo de ventana modal se llama Hoja. Es muy fácil obtener este comportamiento con un segmento de Storyboard, o mediante programación con una subclase NSViewController . El siguiente ejemplo es solo una aplicación de OS X Cocoa en blanco creada por Xcode. (Elegí Swift como el idioma, pero funcionará de la misma manera con Objective-C).

Lo único que agregué al guión gráfico fue un segundo controlador de vista para la vista de hoja, y una etiqueta y un botón en cada vista.

Visualización de la vista de hoja con un guión gráfico

Con el controlador de Vista de hoja seleccionado y la pestaña Inspector de conexiones en pantalla, conecte "Presentar segmentos - hoja" al botón "Mostrar hoja".

Conecte "Acciones recibidas - cederController:" al botón "Cerrar hoja".

¡Eso es! No se necesita ningún código para hacer que este ejemplo funcione; simplemente construir y ejecutar.

Visualización de la vista de hoja mediante programación

Tenga en cuenta que Xcode crea el proyecto predeterminado con dos archivos de clase personalizados. En el Guión gráfico, AppDelegate.swift está representado en la escena de la aplicación:

No necesitamos usar el AppDelegate para este ejemplo, pero puede usarlo para interactuar con el Menú principal u otras cosas.

La clase personalizada ViewController.swift se utilizará para presentar la hoja. Está representado en la escena del controlador de vista:

Para crear una instancia del Controlador de vista de hoja mediante programación, se necesita una ID de guión gráfico. Aquí, le daremos el ID " SheetViewController ". Tenga en cuenta que sigue siendo un simple NSViewController ; no necesitamos convertirlo en una clase personalizada para este ejemplo, pero su aplicación podría querer:

Al mostrar el archivo ViewController.swift en el editor asistente, presione Ctrl y arrastre una conexión desde el botón "Mostrar hoja" a la clase personalizada. Esto creará un código de código auxiliar para una función @IBAction que llamaremos "displaySheet":

En el archivo ViewController.swift , implementaremos el Controlador de vista de hoja como una var. Se instanciará solo una vez, la primera vez que se acceda. Eso sucederá la primera vez que se llame a la función displaySheet.

// ViewController.swift import Cocoa class ViewController: NSViewController { lazy var sheetViewController: NSViewController = { return self.storyboard!.instantiateControllerWithIdentifier("SheetViewController") as! NSViewController }() @IBAction func displaySheet(sender: AnyObject) { self.presentViewControllerAsSheet(sheetViewController) } }

Versión Swift 4:

// ViewController.swift import Cocoa class ViewController: NSViewController { lazy var sheetViewController: NSViewController = { return self.storyboard!.instantiateController(withIdentifier: NSStoryboard.SceneIdentifier(rawValue: "SheetViewController")) as! NSViewController }() @IBAction func displaySheet(sender: AnyObject) { self.presentViewControllerAsSheet(sheetViewController) } }

Como en el primer ejemplo, el botón "Cerrar hoja" está conectado a la acción "dismissController:" en el Controlador de vista de hoja. Alternativamente, puede llamar a esa función programáticamente desde su clase ViewController:

self.dismissController(sheetViewController)

Para obtener más información, consulte el documento "Temas de programación de hojas" de Apple: https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/Sheets/Sheets.html