web-dev-qa-db-fra.com

Comment créer une fenêtre coulissante modale sous Mac OS?

Comment puis-je créer une fenêtre modale coulissante/afficher "dans la fenêtre" sur XCode comme sur ces captures d'écran?

J'ai essayé de créer un nouveau contrôleur de fenêtre avec une animation "Style de panneau d'authentification" mais je ne reçois que des plantages XCode.

modal window

21
Vasily

Ce type de fenêtre modale s'appelle une feuille. Il est très facile d'obtenir ce comportement avec une séquence Storyboard, ou par programme avec une sous-classe NSViewController. L'exemple ci-dessous n'est qu'une application OS X Cocoa vierge créée par Xcode. (J'ai choisi Swift comme langue, mais cela fonctionnera de la même manière avec Objective-C.)

Les seules choses que j'ai ajoutées au storyboard étaient un deuxième contrôleur de vue pour la vue de feuille, et une étiquette et un bouton poussoir sur chaque vue.

Affichage de la vue de feuille avec une séquence de storyboard

Avec le contrôleur Sheet View sélectionné et l'onglet Inspecteur des connexions affiché, connectez "Presenting Segues - sheet" au bouton "Display Sheet".

enter image description here

Connectez "Actions reçues - ignorerContrôleur:" au bouton "Fermer la feuille".

enter image description here

C'est ça! Aucun code n'est nécessaire pour faire fonctionner cet exemple; il suffit de construire et d'exécuter.


Affichage de la vue de feuille par programme

Notez que Xcode crée le projet par défaut avec deux fichiers de classe personnalisés. Dans le Storyboard, AppDelegate.Swift est représenté dans la scène Application:

enter image description here

Nous n'avons pas besoin d'utiliser l'AppDelegate pour cet exemple, mais vous pouvez l'utiliser pour l'interaction avec le menu principal ou d'autres choses.

La classe personnalisée ViewController.Swift sera utilisée pour présenter la feuille. Il est représenté dans la scène View Controller:

enter image description here


Pour instancier le Sheet View Controller par programmation, il a besoin d'un ID Storyboard. Ici, nous lui donnerons l'ID " SheetViewController". Notez que c'est toujours un simple NSViewController; nous n'avons pas besoin d'en faire une classe personnalisée pour cet exemple, mais votre application peut vouloir:

enter image description here


En affichant le fichier ViewController.Swift dans l'éditeur d'assistant, faites Ctrl-faites glisser une connexion depuis le bouton "Afficher la feuille" dans la classe personnalisée. Cela créera du code de remplacement pour une fonction @IBAction que nous nommerons "displaySheet":

enter image description here

Dans le fichier ViewController.Swift, nous implémenterons le Sheet View Controller en tant que var paresseux. Il ne sera instancié qu'une seule fois, la première fois qu'il sera consulté. Cela se produira lors du premier appel de la fonction 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)
    }
}

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

Comme dans le premier exemple, le bouton "Fermer la feuille" est connecté à l'action "rejeterContrôleur:" sur le contrôleur de vue de feuille. Alternativement, vous pouvez appeler cette fonction par programme à partir de votre classe ViewController:

self.dismissController(sheetViewController)

Pour plus d'informations, reportez-vous au document Apple "Sheets Programming Topics": https://developer.Apple.com/library/content/documentation/Cocoa/Conceptual/Sheets/ Sheets.html

72
ElmerCat

version Objective-C:

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