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

Comment puis-je créer une fenêtre modale coulissante/afficher "in-window" sur XCode comme sur ces screenshot?

j'ai essayé de créer un nouveau contrôleur de fenêtre avec l'animation" Authentication panel style " Mais je ne reçois que des pannes XCode.

modal window

16
demandé sur Vasily 2015-09-06 20:27:45

2 réponses

ce genre de fenêtre modale s'appelle une feuille. Il est très facile d'obtenir ce comportement avec une séquence Storyboard, ou par programmation avec un NSViewController sous-classe. L'exemple ci-dessous n'est qu'une application vierge OS X Cocoa 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 contrôleur de seconde vue pour la vue en feuille, et une étiquette et un bouton-poussoir sur chaque vue.

Affichage La Vue En Feuille Avec Un Story-Board Suit

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

enter image description here

se Connecter ", a Reçu des Actions - dismissController:" à "Fermer la Feuille" bouton.

enter image description here

C'est ça! Il n'y a pas de code nécessaire pour faire fonctionner cet exemple; juste générer et exécuter.


Affichage De La Vue De Liste Par Programmation

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 D'Application:

enter image description here

Nous n'avons pas besoin d'utiliser l'AppDelegate pour cet exemple, mais vous pouvez l'utiliser pour interagir avec le Menu Principal, ou d'autres chose.

la coutume ViewController.swift la classe custom 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 contrôleur de vue en feuille par programmation, il faut un ID de Storyboard. Ici, nous allons lui donner l'ID "SheetViewController". Notez qu'il est encore brut NSViewController; nous n'avons pas besoin d'en faire une classe personnalisée pour cet exemple, mais votre application peut:

enter image description here


Affichage ViewController.swift fichier dans l'éditeur assistant, Ctrl-faites glisser une connexion à partir du bouton "Display Sheet" dans la classe personnalisée. Cela créera du code de raccourci pour une fonction @IBAction que nous nommerons "displaySheet":

enter image description here

Dans le ViewController.swift file, nous allons mettre en œuvre le contrôleur de vue de feuille comme un var paresseux. Il ne sera instancié qu'une fois, la première fois qu'il est accédé. Cela se produira la première fois que la fonction displaySheet est appelée.

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

Swift 4 version:

//  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 relié à l'action "controller:" du contrôleur de vue de feuille. Vous pouvez aussi appeler cette fonction par programmation À partir de votre ViewController. classe:

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

56
répondu ElmerCat 2018-03-01 06:13:56

Objective-C version:

- (IBAction)displaySheet:(id)sender {
    NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle: nil];
    NSViewController * vc = [storyboard instantiateControllerWithIdentifier:@"SheetViewController"];
    [self presentViewControllerAsSheet:vc];}
0
répondu HaiderSahib 2018-05-04 16:41:56