Mettre la fenêtre au premier plan

Bonjour, 


 


Je souhaite faire une fonction pour mettre ma fenêtre au premier plan .


J'ai cherché plusieurs moyens de manipuler une sorte d'objet window mais je n'ai rien trouvé .. tout se passe en GUI (et rien concernant la position premier plan, arrière plan ect ...)


 


Auriez vous des infos sur comment faire ?


 


Merci pour votre aide,


 


Bonne journée !  :)


 


Réponses

  • Joanna CarterJoanna Carter Membre, Modérateur
    Il faut plus d'infos.


    Quelle fenêtre ; Principale ou autre ?
  • Pour une des fenêtres de ton application tu peux utiliser l'une des fonctions suivantes de ta NSWindow :


     


    - makeKeyAndOrderFront:



    Moves the window to the front of the screen list, within its level, and makes it the key window; that is, it shows the window.



    - orderFront:



    Moves the window to the front of its level in the screen list, without changing either the key window or the main window.


     


     




  • Il faut plus d'infos.


    Quelle fenêtre ; Principale ou autre ?




     La fenêtre principale 


     




     


    Pour une des fenêtres de ton application tu peux utiliser l'une des fonctions suivantes de ta NSWindow :


     


    - makeKeyAndOrderFront:



    Moves the window to the front of the screen list, within its level, and makes it the key window; that is, it shows the window.



    - orderFront:



    Moves the window to the front of its level in the screen list, without changing either the key window or the main window.


     


     



     




    Merci je vais regarder ça .


     


    Mais par contre comment récupérer notre window sous forme de NSwindow ? il y a une sorte de méthode get dans la classe NSwindow ?

  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2017 modifié #5


     La fenêtre principale 




     


    D'où veux-tu faire l'appel ?


     




    Mais par contre comment récupérer notre window sous forme de NSwindow ? il y a une sorte de méthode get dans la classe NSwindow ?




     


    Tu parles d'afficher une fenêtre d'une appli qui n'est pas la tienne ?


     


    Si oui, pourquoi ?


  • awesomemanawesomeman Membre
    août 2017 modifié #6

    D'où veux-tu faire l'appel ?

     

     

    Tu parles d'afficher une fenêtre d'une appli qui n'est pas la tienne ?

     

    Si oui, pourquoi ?



     

    Justement je ne sais pas ou je dois appeler cette fenêtre .

    À la base j'aurai bien dis dans NSViewController mais cette classe n'est pas fait pour ça .

     

    Si, la fenêtre est bien la mienne, c'est ma fenêtre principale .

    Une image va surement aider : 

     

     WCControllerStoryboardId.png


     


    C'est une fenêtre comme sur cette image que je veux manipuler (enfin presque ici, c'est le window controler qui est sélectionné)


     

    je veux placer une fenêtre au premier plan . C'est une window on doit donc utiliser NSWindow mais comment récupérer la fenêtre sous forme de NSWindow dans du code ?


     


    Tout simplement, comment manipuler ma fenêtre (de type NSWindow ) dans du code swift plutôt que dans la GUI comme au dessus .


  • Joanna CarterJoanna Carter Membre, Modérateur
    Dans un storyboard, on peut le lier avec un segue d'un bouton. Du coup, appuyant sur le bouton déclenchera l'affiche de la fenêtre.
  • Oui mais placer un bouton sur la fenêtre que l'on veut affiché n'a aucun sens, ça n'aura aucun effet ..


     


    Ma situation est la suivante : je fais un appel au module LocalAuthentification avant d'accéder à  l'application .


    Problème, quand la fenêtre pour demander le mdp (avec LocalAuthentification) disparait l'application reste masqué .


     


    Alors je sais que c'est en peu bête de s'embêter avec ça, il suffit de cliquer sur l'icône de l'app mais bon, j'aimerais bien faire les choses parfaitement  :D


     


    Ce qu'il faudrait c'est dire que : quand le mdp est validé avec LocalAuthentification il faut mettre la fenêtre principale au premier plan (ou l'afficher)


  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2017 modifié #9

    Tu n'as pas encore nous donné assez d'infos sur ce que tu as déjà  fait et précisément ce que tu veux faire.


     


    Il faut recommencer au commencement et préciser, pas après pas, ce que tu veuilles arriver.


     


    De mon exemple, j'ai supposé que tu as une fenêtre déjà  visible avant d'afficher la fenêtre de MdP ; c'est bien le cas ou non ?


  • Non la fenêtre de MdP apparait en premier, si le MdP est bon la seconde fenêtre s'affiche . Lorsque cette dernière s'affiche elle n'est pas visible puisqu'elle est au dernier plan (caché par toutes les autres fenêtres d'ouvertes comme Xcode ou chrome) . Ce que je veux c'est pourvoir la mettre au premier plan, devant toutes les autres fenêtres .


     


    Je veux bien être plus explicite mais sans images c'est inutile et je ne comprends pas comment en ajouter avec ce système de forum ..


    Le "insérer une image" ne fonctionne qu'avec des url ..



  • je vais posté tout le code "important" pour mieux comprendre à  défaut de pouvoir mettre des screenshots :


     


    la fonction pour demander l'authentification à  l'utilisateur est askPass . Les booléens valid et breakit sont initialisé à  false . lorsque valid est à  true la seconde fenêtre s'affiche et si breakit est à  true l'app quitte .



    askPass()
    while true {
    if (valid)!
    {
    print("Good Password")
    break
    }
    if (breakit)!
    {
    print("Fail")
    break
    }
    }
  • Joanna CarterJoanna Carter Membre, Modérateur
    Tu rigoles ! Tout le code "important" ? ça ne nous rien dit.


    Côté ajoute d'images, tu n'as pas vu le bouton "plus d'options de réponse" en dessous la boà®te de saisie ?


    Mais, en devinant, nous venons juste de discuter les fenêtres pour les MdP juste à  côté de ton message http://forum.cocoacafe.fr/topic/15333-fenetre-pour-saisie-mot-de-passe/?p=148332
  • ah merci pour les images, en effet je n'ai pas bien regardé ..


     


    Merci pour le lien sur le forum mais je n'ais pas de problème avec la fenêtre de MDP, j'utilise le Framework d'apple "LocalAuthentification". C'est lui qui créée la fenêtre de MDP et qui s'occupe de le vérifier .


     


    voilà  donc ma première fenêtre, celle qui demande le MDP à  l'utilisateur :


     


  • Joanna CarterJoanna Carter Membre, Modérateur
    Et tu appelles ce méthode d'où ?


  • Et tu appelles ce méthode d'où ?




    La méthode askPass ? 


     


    ici (dans le NSViewController) :



    override func viewDidLoad() {
    super.viewDidLoad()

    askPass()
    while true {
    if (valid)!
    {
    print("Good Password")
    break
    }
    if (breakit)!
    {
    print("Fail")
    break
    }
    }

    // Do any additional setup after loading the view.
  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2017 modifié #16

    Bah non ! tu attends trop avant de faire l'authorisation.


     


    Dans l'AppDelegate :



    @NSApplicationMain
    class AppDelegate: NSObject, NSApplicationDelegate
    {
    func applicationWillFinishLaunching(_ notification: Notification)
    {
    let authenticationContext = LAContext()

    var authenticationError: NSError?

    guard #available(OSX 10.12, *),
    authenticationContext.canEvaluatePolicy(LAPolicy.deviceOwnerAuthentication, error: &authenticationError) else
    {
    NSApp.terminate(self)

    return
    }

    let myLocalizedReasonString = "ZONE SENSIBLE"

    authenticationContext.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: myLocalizedReasonString)
    {
    (success, evaluateError) in

    if !success
    {
    NSApp.terminate(self)
    }
    }
    }
    }

    C'est tout  8--)


  • Joanna CarterJoanna Carter Membre, Modérateur

    Ou, si tu veux que la fenêtre principale ne s'affiche pas avant l'authorisation, il faut décocher "Is initial Controller" sur le NSWindowController dans le storyboard et le donner un "Storyboard Id".


     


    Puis il ne faut que le code suivant dans l'AppDelegate :



    @NSApplicationMain
    class AppDelegate: NSObject, NSApplicationDelegate
    {
    var mainWindowController: NSWindowController?

    func applicationDidFinishLaunching(_ notification: Notification)
    {
    let authenticationContext = LAContext()

    var authenticationError: NSError?

    guard #available(OSX 10.12, *),
    authenticationContext.canEvaluatePolicy(LAPolicy.deviceOwnerAuthentication, error: &authenticationError) else
    {
    NSApp.terminate(self)

    return
    }

    let myLocalizedReasonString = "ZONE SENSIBLE"

    authenticationContext.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: myLocalizedReasonString)
    {
    (success, evaluateError) in

    guard success else
    {
    NSApp.terminate(self)

    return
    }

    let storyboard = NSStoryboard(name: "Main", bundle: nil)

    self.mainWindowController = storyboard.instantiateController(withIdentifier: "MainWindowController") as? NSWindowController

    guard let mainWindowController = self.mainWindowController,
    let mainWindow = mainWindowController.window else
    {
    fatalError("Error getting main window controller")
    }

    DispatchQueue.main.async
    {
    mainWindow.makeKeyAndOrderFront(nil)
    }
    }
    }
    }
  • awesomemanawesomeman Membre
    août 2017 modifié #18

    Ah merci mon code est plus propre et cette fois ça fonctionne 


     


    Juste deux petites questions :


     


    - à  quoi sert l'AppDelegate ? quel est son rôle ?


     


    - auriez vous des bons tutos pour comprendre / manier Xcode et tous le système de AppDelegate, WindowController, ViewController ect .. je trouve le dev apple sur Xcode assez complexe (sauf pour swift qui est bien documenté ) .


     


    et enfin une petite remarque :


     


    Le code que vous m'avez fournit donne un petit warning 10 seconde après son exécution : 



    CoreAnimation: warning, deleted thread with uncommitted CATransaction; created by:
    0 QuartzCore 0x00007fffd434a053 _ZN2CA11Transaction4pushEb + 375
    1 QuartzCore 0x00007fffd434a48e _ZN2CA11Transaction15ensure_implicitEv + 286
    2 QuartzCore 0x00007fffd434a93c _ZN2CA11Transaction8set_seedEj + 30
    3 QuartzCore 0x00007fffd44bf522 +[CATransaction(CATransactionPrivate)

    ...............

    Une idée ?


     


    Merci pour votre aide !

  • Joanna CarterJoanna Carter Membre, Modérateur
    août 2017 modifié #19


    - à  quoi sert l'AppDelegate ? quel est son rôle ?




     


    C'est tout simplement un delegate pour l'app  :-*


     


    Ton app tourne soi-même mais, de temps en temps, elle a besoin de plus d'informations de toi ou elle veut te dire qqch. sur son état. Le delegate écoute pour les "appels" de l'appli, c'est à  toi de les répondre.


     




    - auriez vous des bons tutos pour comprendre / manier Xcode et tous le système de AppDelegate, WindowController, ViewController ect .. je trouve le dev apple sur Xcode assez complexe (sauf pour swift qui est bien documenté )




     


    Les meilleurs tutos sont ceux qui répondent à  tes besoins du moment.


     


    ça depend aussi sur ton niveau d'expérience en programmation, quelles langues que tu as déjà  utilisé, quels environments de développement que tu as déjà  utilisé.


     


    Il faut te présenter ici, afin que nous puissions te connaà®tre mieux et te donner les conseils plus ciblés.


     




    Le code que vous m'avez fournit donne un petit warning 10 seconde après son exécution




     


    Désolée. Je ne l'ai pas testé assez. Tous le code qui concerne UIKit doit être fait sur le fil principal ; du coup, il faut déplacer le code qui charge le WindowController vers le Dispatch.main.sync :



    @NSApplicationMain
    class AppDelegate: NSObject, NSApplicationDelegate
    {
    var mainWindowController: NSWindowController?

    func applicationDidFinishLaunching(_ notification: Notification)
    {
    let authenticationContext = LAContext()

    var authenticationError: NSError?

    guard #available(OSX 10.12, *),
    authenticationContext.canEvaluatePolicy(LAPolicy.deviceOwnerAuthentication, error: &authenticationError) else
    {
    NSApp.terminate(self)

    return
    }

    let myLocalizedReasonString = "ZONE SENSIBLE"

    authenticationContext.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: myLocalizedReasonString)
    {
    (success, evaluateError) in

    guard success else
    {
    NSApp.terminate(self)

    return
    }

    let storyboard = NSStoryboard(name: "Main", bundle: nil)

    DispatchQueue.main.async
    {
    self.mainWindowController = storyboard.instantiateController(withIdentifier: "MainWindowController") as? NSWindowController

    guard let mainWindowController = self.mainWindowController,
    let mainWindow = mainWindowController.window else
    {
    fatalError("Error getting main window controller")
    }

    mainWindow.makeKeyAndOrderFront(nil)
    }
    }
    }
    }

    Oh, et tu devrais traiter l'erreur dans le closure :



    authenticationContext.evaluatePolicy(.deviceOwnerAuthentication, localizedReason: myLocalizedReasonString)
    {
    (success, error) in

    if let error = error as? LAError.Code
    {
    switch error
    {
    case .appCancel:
    ...
    case .passcodeNotSet:
    ...
    ... etc
    }
    }

    ...

  • Joanna CarterJoanna Carter Membre, Modérateur

    Un petit souci sur ce que tu tentes de faire.


     


    Si l'utilisateur se trompait en saisissant le MdP, l'app se ferme tout de suite, sans avertissement ou renseignement, ce qui me semble, au moins, impoli.


     


    Si c'était moi, je me dirait "qu'est-ce que j'ai fait ? - c'était une erreur de saisi ou quoi ?"


  • awesomemanawesomeman Membre
    août 2017 modifié #21

    Ahhhh d'accord je n'avais pas compris que le delegate était un concept de programmation, je ne connaissais absolument pas ..


     



     


    ça depend aussi sur ton niveau d'expérience en programmation, quelles langues que tu as déjà  utilisé, quels environments de développement que tu as déjà  utilisé.


     


    Il faut te présenter ici, afin que nous puissions te connaà®tre mieux et te donner les conseils plus ciblés.



     



    Je crois que je m'étais déjà  présenté il y a un an, lorsque j'avais tout juste découvert swift .


     


    Pour mon expérience j'ai appris pas mal de langages mais il y en a vraiment peu que je maitrise vraiment .


     


    Ceux que je connais le mieux sont : le C/C++, php et bash .


    Soit ce sont des langages un peu vieillissants ..


     


    Pour ce qui est des langages "effleurer" : javascript, java, perl et python .


     



     


     


    Désolée. Je ne l'ai pas testé assez. Tous le code qui concerne UIKit doit être fait sur le fil principal ; du coup, il faut déplacer le code qui charge le WindowController vers le Dispatch.main.sync

     


    Merci je vais regarder ça ;)


     



     


    Un petit souci sur ce que tu tentes de faire.


     


    Si l'utilisateur se trompait en saisissant le MdP, l'app se ferme tout de suite, sans avertissement ou renseignement, ce qui me semble, au moins, impoli.


     


    Si c'était moi, je me dirait "qu'est-ce que j'ai fait ? - c'était une erreur de saisi ou quoi ?"



     


    C'est vrai, je l'ai déjà  modifié . D'ailleurs le LocalAuthentification d'apple fait très bien le travail .


     


    à  vrai dire, l'application est à  la base destiné uniquement pour moi (Oui c'est un peu égocentrique ::) ) . Je pense que je vais un peu mettre en suspens ce projet pour approfondir mes connaissances en swift avec du code pur .


     


    En tout cas merci pour tout !


Connectez-vous ou Inscrivez-vous pour répondre.