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.
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.
Avec le contrôleur Sheet View sélectionné et l'onglet Inspecteur des connexions affiché, connectez "Presenting Segues - sheet" au bouton "Display Sheet".
Connectez "Actions reçues - ignorerContrôleur:" au bouton "Fermer la feuille".
C'est ça! Aucun code n'est nécessaire pour faire fonctionner cet exemple; il suffit de construire et d'exécuter.
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:
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:
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:
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":
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
version Objective-C:
- (IBAction)displaySheet:(id)sender {
NSStoryboard *storyboard = [NSStoryboard storyboardWithName:@"Main" bundle: nil];
NSViewController * vc = [storyboard instantiateControllerWithIdentifier:@"SheetViewController"];
[self presentViewControllerAsSheet:vc];}