Aller au contenu


Photo

Mettre la fenêtre au premier plan


  • Please log in to reply
20 réponses à ce sujet

#1 awesomeman

awesomeman

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 18 messages

Posté 05 août 2017 - 16:58

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 !  :)

 



#2 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 999 messages
  • LocationPlestin-les-Grèves (22)

Posté 05 août 2017 - 19:17

Il faut plus d'infos.

Quelle fenêtre ; Principale ou autre ?

#3 fleurantin

fleurantin

    Cueilleur de cabosses

  • Membre
  • PipPipPip
  • 110 messages

Posté 06 août 2017 - 08:51

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.

 

 


____________________________________________________________

:P L'expérience est une lanterne accrochée dans notre dos qui n'éclaire que le chemin parcouru. (Confucius) 


#4 awesomeman

awesomeman

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 18 messages

Posté 06 août 2017 - 16:23

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 ?



#5 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 999 messages
  • LocationPlestin-les-Grèves (22)

Posté 06 août 2017 - 16:27

 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 ?



#6 awesomeman

awesomeman

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 18 messages

Posté 07 août 2017 - 14:06

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 .



#7 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 999 messages
  • LocationPlestin-les-Grèves (22)

Posté 07 août 2017 - 14:18

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.

#8 awesomeman

awesomeman

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 18 messages

Posté 07 août 2017 - 15:32

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)



#9 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 999 messages
  • LocationPlestin-les-Grèves (22)

Posté 07 août 2017 - 15:40

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 ?



#10 awesomeman

awesomeman

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 18 messages

Posté 16 août 2017 - 03:56

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 ..



#11 awesomeman

awesomeman

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 18 messages

Posté 16 août 2017 - 04:04

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


#12 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 999 messages
  • LocationPlestin-les-Grèves (22)

Posté 16 août 2017 - 09:25

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.cocoaca...passe/?p=148332

#13 awesomeman

awesomeman

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 18 messages

Posté 16 août 2017 - 16:40

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 :

 

Fichier joint  Capture d’écran 2017-08-16 à 04.48.02.png   30,55 Ko   0 téléchargement(s)

 

et voici le code qui lui correspond :

	func askPass() -> Void {
		let myContext = LAContext()
		let myLocalizedReasonString = "ZONE SENSIBLE"
		var authError: NSError? = nil
		
		if #available(OSX 10.12, *) {
			if myContext.canEvaluatePolicy(LAPolicy.deviceOwnerAuthentication, error: &authError) {
				myContext.evaluatePolicy(LAPolicy.deviceOwnerAuthentication, localizedReason: myLocalizedReasonString) { (success, evaluateError) in
					if (success) {
						self.valid = true
						print("OK FOR AUTH")
					} else {
						self.breakit = true
						NSApplication.shared().terminate(self)
					}
				}
			} else {
				breakit = true
				NSApplication.shared().terminate(self)
			}
		} else {
			breakit = true
			NSApplication.shared().terminate(self)
			}
	}

ci dessous, la fenêtre qui s'affiche après que l'utilisateur ait entré son MDP :

 

Fichier joint  Capture d’écran 2017-08-16 à 04.48.20.png   16,61 Ko   0 téléchargement(s)

 

si le MDP est mauvais alors l'application quitte .

 

Mon problème est tout simple, lorsque je rentre le MDP et que celui ci est valide, la fenêtre apparait bien mais elle est caché par les autres applications ouvertes (ex chrome et xcode) .

Ce que je veux, c'est donc placer la fenêtre de mon application devant les autres, au premier plan .

 

J'espère avoir été plus clair .

Merci pour votre patience 

 



#14 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 999 messages
  • LocationPlestin-les-Grèves (22)

Posté 16 août 2017 - 16:52

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

#15 awesomeman

awesomeman

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 18 messages

Posté 16 août 2017 - 19:12

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.
	} 


#16 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 999 messages
  • LocationPlestin-les-Grèves (22)

Posté 16 août 2017 - 19:49

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



#17 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 999 messages
  • LocationPlestin-les-Grèves (22)

Posté 16 août 2017 - 20:35

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


#18 awesomeman

awesomeman

    Eleveur de cacaoyers

  • Membre
  • PipPip
  • 18 messages

Posté 16 août 2017 - 23:15

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

 

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 !



#19 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 999 messages
  • LocationPlestin-les-Grèves (22)

Posté 17 août 2017 - 10:44

- à 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
        }
      }
      
     … 


#20 Joanna Carter

Joanna Carter

    Broyeur de fèves

  • Contrôleur d'arômes
  • 1 999 messages
  • LocationPlestin-les-Grèves (22)

Posté 17 août 2017 - 10:55

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 ?"






0 utilisateur(s) li(sen)t ce sujet

0 membre(s), 0 invité(s), 0 utilisateur(s) anonyme(s)