Partage
  • Partager sur Facebook
  • Partager sur Twitter

MOOC Une application iPhone avec le modèle MVC

    10 mai 2018 à 16:43:48

    Bon je me réponds à moi même, j'avais loupé ce sujet : https://openclassrooms.com/forum/sujet/developpez-une-application-iphone-avec-modele-mvc

    Du coup j'ai revérifier mon code et j'envoyais une notification sous un nom différent de cette attendue...

    j'ai donc toujours l'erreur mais les questions sont bien chargées et affichées... je peux enfin continuer mon cours :D

    Et en même temps mon soucis de centrage dans le simulateur venait simplement de la l'appareil cible lorsque je faisais mon Cmd+R

    Dur dur les débuts :D

    -
    Edité par Jean-NoëlVOIRIN 10 mai 2018 à 16:45:44

    • Partager sur Facebook
    • Partager sur Twitter
      17 juin 2018 à 17:04:04

      Bonjour à tous,

      Je tente actuellement de faire l'activité de fin cours, mais je bloque sur un point...

      Je cherche à créer une animation (de fond jaune avec un texte du genre "Félicitations 1 point de plus"), mais la valeur que je met dans le paramètre "withDuration" de la méthode de classe animate de UIView, ne m'affecte que le temps où ma vue revient à son point d'origine. La couleur de fond et le texte, eux ne restent pas pendant l'animation. Comment faire pour que l'animation les prennent en compte avant de m'afficher la question suivante.

      Sinon, existe-t-il un "delay", pour mettre en pause le temps que l'animation soit terminé?

      Je vous remercie par avance pour votre aide.

      Cordialement,

      • Partager sur Facebook
      • Partager sur Twitter
        18 juin 2018 à 8:56:17

        Salut,

        je n’ai Pas compris ce que tu souhaitais faire (hormis afficher un texte sur fond jaune). Elle est censée faire quoi l’animation ?

        Peux-Tu montrer ce que tu as fait et decrire Le résultat obtenu et le résultat attendu ?

        • Partager sur Facebook
        • Partager sur Twitter
          18 juin 2018 à 17:38:33

          Bonjour Geda,

          Alors je souhaite que lorsque le score augmente de un point, une vue s'affiche avec un fond jaune et un texte "Félicitations ..." en replaçant la vue au centre, avant d'afficher la question suivante. Je souhaiterai cette vue reste affiché un certain temps (genre 2sec, fin à définir(pour les essais j'ai mis 5)).

          Alors le résultat obtenu est que l'animation se met bien en fonction que lorsque le score augmente (j'ai créé une propriété ok dans la classe game que je récupère dans le viewController), la vue s'anime pour retourner vers le centre avec une animation spring (pendant le temps que j'ai défini dans l'animation donc ici 5sec), mais le fond et le text qui apparaissent sont ceux de la question suivante.

          J'ai une petite question supplémentaire, en swift existe t'il un moyen de faire des pauses? j'ai essayé de cherché avec delay mais je ne trouve rien.

          Je te joint le code du view controller:

          import UIKit
          
          class ViewController: UIViewController {
              
              @IBOutlet weak var newGameButton: UIButton!
              @IBOutlet weak var activityIndicator: UIActivityIndicatorView!
              @IBOutlet weak var questionView: QuestionView!
              @IBOutlet weak var scoreLabel: UILabel!
              
              var game = Game()
              
              override func viewDidLoad() {
                  super.viewDidLoad()
                  let name = Notification.Name(rawValue: "QuestionsLoaded")
                  NotificationCenter.default.addObserver(self, selector: #selector(questionsLoaded), name: name, object: nil)
                  
                  startNewGame()
                  
                  let panGestureRecognizer = UIPanGestureRecognizer(target: self, action: #selector(dragQuestionView(_:)))
                  questionView.addGestureRecognizer(panGestureRecognizer)
                  
              }
              
              @objc func questionsLoaded() {
                  activityIndicator.isHidden = true
                  newGameButton.isHidden = false
                  
                  questionView.title = game.currentQuestion.title
              }
              
              @objc func dragQuestionView(_ sender: UIPanGestureRecognizer){
                  if game.state == .ongoing {
                      switch sender.state {
                          case .began, .changed: // mouvement en cours
                              // La vue doit suivre le doigt
                              transformQuestionViewWith(gesture: sender)
                          case .ended, .cancelled: // mouvement fini
                              // On enregistre la réponse choisie et proposer la question suivante
                              answerQuestion()
                          default:
                          break
                      }
                  }
              }
          
              @IBAction func didTapNewGameButton() {
                  startNewGame()
              }
              
              private func startNewGame () {
                  newGameButton.isHidden = true
                  activityIndicator.isHidden = false
                  
                  questionView.title = "Loading ..."
                  questionView.style = .standard
                  
                  scoreLabel.text = "0 / 10"
                  
                  game.refresh()
                  
              }
              
              private func transformQuestionViewWith(gesture: UIPanGestureRecognizer){
                  // la vue doit suivre le doigt
                  
                  // On créé une constante translation qui va stocker le geste
                  let translation = gesture.translation(in: questionView)
                  
                  // On fait suivre la vue en fonction des coordonnées du geste
                  let translationTransform = CGAffineTransform(translationX: translation.x, y: translation.y)
                  
                  // On fait tourner la vue proportionnellement à l'eloignement dans une plage - pi/3 +pi/3
                  let translationPercent = translation.x / (UIScreen.main.bounds.width / 2)
                  let rotationAngle = (CGFloat.pi / 3) * translationPercent
                  let rotationTransform = CGAffineTransform(rotationAngle: rotationAngle)
                  
                  // On concatene nos deux transformation et les lient à la vue
                  let transform = translationTransform.concatenating(rotationTransform)
                  questionView.transform = transform
                  
                  // On défini le style de la vue en fonction du coté vers lequel on fait le geste
                  if translation.x > 0 {
                      // On va vers la droite c'est correct
                      questionView.style = .correct
                  } else {
                      // Sinon on va vers la gauche et c'est faux
                      questionView.style = .incorrect
                  }
              }
              
              private func answerQuestion() {
                  switch questionView.style {
                  case .correct:
                      game.answerCurrentQuestion(with: true)
                  case .incorrect:
                      game.answerCurrentQuestion(with: false)
                  case .standard:
                      break
                  case .trophee:
                      break
                  }
                  
                  scoreLabel.text = "\(game.score) / 10"
                  
                  let screenWidth = UIScreen.main.bounds.width
                  var translationTransform: CGAffineTransform
                  
                  if (game.ok == false){
                      if questionView.style == .correct {
                          translationTransform = CGAffineTransform(translationX: screenWidth, y: 0)
                      } else {
                          translationTransform = CGAffineTransform(translationX: -screenWidth, y: 0)
                          }
                  
                      UIView.animate(withDuration: 0.3, animations: {
                          self.questionView.transform = translationTransform
                      }, completion: { (success) in
                          if success {
                              self.showQuestionView()
                          }
                      })
                  } else {
                      game.ok = false
                      game.state = .over
                      
                      UIView.animate(withDuration: 5.0, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: [], animations: {self.trophee()
                      }, completion:nil)
                      
                      game.state = .ongoing
                      answerQuestion()
                  }
              }
              
              private func trophee() {
                  questionView.transform = .identity
                  questionView.style = .trophee
                  questionView.title = "Félicitations 1 point de plus!"
              }
              
              
              private func showQuestionView() {
                  questionView.transform = .identity
                  questionView.transform = CGAffineTransform(scaleX: 0.01, y: 0.01)
                  
                  questionView.style = .standard
                  
                  switch game.state {
                  case .ongoing:
                      questionView.title = game.currentQuestion.title
                  case .over:
                      questionView.title = "Game Over"
                      questionView.backgroundColor = #colorLiteral(red: 0.9254902005, green: 0.2352941185, blue: 0.1019607857, alpha: 1)
                  }
                  
                  UIView.animate(withDuration: 0.4, delay: 0.0, usingSpringWithDamping: 0.5, initialSpringVelocity: 0.5, options: [], animations: {
                      self.questionView.transform = .identity
                  }, completion:nil)
              }
          }
          

          A noter que dans questionView j'ai rajouter un style .trophee pour mes essais afin d'avoir juste à l'appeler:

          case .trophee:
                      icon.isHidden = true
                      backgroundColor = #colorLiteral(red: 0.9686274529, green: 0.78039217, blue: 0.3450980484, alpha: 1)
                      label.text = "Félicitations"

          Tu remarqueras que le texte est légèrement différent, mais c'est pour savoir qu'elle "méthode" a fonctionné.

          Je te remercie beaucoup pour ton aide.



          • Partager sur Facebook
          • Partager sur Twitter
            18 juin 2018 à 18:30:54

            Donc le problème c’est juste le texte ? Rien a voir avec l’animation ?

            tu dis que tu as rajouté un case .trophee mais je vois nul part game.state = .trophee. Le problème vient peut-être de la, non ?

            pour la pause, tu peux faire un dispatch.main.asyncAfter. Globalement, regarde du côté du GCD ça devrait t’intéresser. https://www.swiftbysundell.com/posts/a-deep-dive-into-grand-central-dispatch-in-swift

            (Désolé pour le formattage, je suis sur moN téléphone)

            • Partager sur Facebook
            • Partager sur Twitter
              20 juin 2018 à 12:17:53

              Bonjour Geda,

              Alors tu m’as donné l’idee de rajouter un cas .trophee dans l’enum de state.  

              Et grâce à ton lien j'ai trouvé comment effectué une pause avec :

              perform(<#T##aSelector: Selector##Selector#>, with: <#T##Any?#>, afterDelay: <#T##TimeInterval#>)

              Je te remercie beaucoup pour ton aide.

              -
              Edité par papyrus2983 20 juin 2018 à 22:03:46

              • Partager sur Facebook
              • Partager sur Twitter
                9 août 2018 à 14:52:11

                Bonjour, j’ai eu exactement le même problème que Jean-Noël et Erwan et j’ai placé des print() un peu partout dans les classes pour voir où était le problème.

                Effectivement, comme nous l’a dit Geda, le message d’erreur BoringSSL n’empêche pas la récupération des questions sur le site distant, on peut le constater en plaçant un print(questions) dans la classe Game, dans la méthode refresh(), dans la fermeture en argument de QuestionManager.shared.get : les questions s’affichent bien dans la console.

                    func refresh() {
                        score = 0
                        currentIndex = 0
                        state = .over
                        
                        QuestionManager.shared.get { (questions) -> Void in
                            print(questions)
                            self.questions = questions
                            self.state = .ongoing
                
                            let name = Notification.Name(rawValue: "QuestionsLoaded")
                            let notification = Notification(name: name)
                            NotificationCenter.default.post(notification)
                        }
                    }
                

                Dans mon cas, j’avais juste donné un nom différent à l’émission de la notification dans Game.swift (je l’avais nommée QuestionsLoaded, comme dans le cours) et dans l’observation de cette notifications dans ViewController.swift (je ne sais pas pourquoi, mais je l’y ai nommée QuestionLoader), donc ça ne pouvait pas marcher :)

                Maintenant que la notification émise porte exactement le même nom que la notification observée, ça fonctionne parfaitement !

                • Partager sur Facebook
                • Partager sur Twitter
                  4 septembre 2018 à 12:13:04

                  Bonjour,

                  Je vous contacte premièrement pour vous remercier pour votre cours sur le développement d'une application iPhone avec le modèle MVC.

                  Par contre, j'ai un souci. Lorsque je déplace les fichiers viewController.swift et autres pour les ranger selon le modèle MVC, l'application n'est plus fonctionnelle.

                  Comment faire svp ?

                  Merci d'avance pour votre retour.

                  • Partager sur Facebook
                  • Partager sur Twitter
                    23 septembre 2018 à 11:00:14

                    C'est sans doute car tu déplaces le fichier AppDelegate aussi. Depuis Xcode 9, il faut indiquer à Xcode où il se trouve si tu le déplaces. Bon courage !
                    • Partager sur Facebook
                    • Partager sur Twitter
                      31 octobre 2018 à 15:48:09

                      Hello,

                      Oui oui ça fait un moment. J'ai repris la formation et merci pour la réponse. C'est beaucoup mieux maintenant.

                      Ciao

                      • Partager sur Facebook
                      • Partager sur Twitter
                        17 janvier 2019 à 14:18:30

                        Bonjour,

                        Sur le simulateur, au lancement de l'app, reste bloqué sur le launchScreen.storyBoard...

                        Tout fonctionnait jusqu'a l'avant derniere leçon sur le UIGestureRecognizer...

                        Je n'ai pas d'erreur dans le code non plus...

                        Des pistes?

                        Merci beaucoup,

                        Aude

                        -
                        Edité par AudeChevalier1 17 janvier 2019 à 15:49:14

                        • Partager sur Facebook
                        • Partager sur Twitter
                          17 janvier 2019 à 16:37:23

                          Bonjour par AudeChevalier1,

                          As-tu jeté un coup d'oeil à la console ? Essaie de voir les messages d'erreur que tu as dessus.

                          Ciao

                          • Partager sur Facebook
                          • Partager sur Twitter
                            17 janvier 2019 à 19:13:30

                            Hola Lucazinho,

                            Voici la console...

                            • Partager sur Facebook
                            • Partager sur Twitter
                              17 janvier 2019 à 23:05:42

                              Tu n’aurais pas mis un breakpoint par accident ? Tu peux voir tes breakpoint dans l’onglet qui ressemble à une flèche sur le panneau de gauche. L’avant dernier onglet sur ton screenshot

                              -
                              Edité par Geda 17 janvier 2019 à 23:07:06

                              • Partager sur Facebook
                              • Partager sur Twitter
                                18 janvier 2019 à 9:01:49

                                Merci Geda!

                                Oui c'était ça !! 

                                Merci beaucoup :)

                                Désolé pour la question, qui va parraitre un peu bête... C'est pour me permettre de bien comprendre...

                                J'ai remarqué que dans notre class Game, nous n'avons pas d'initialiseur, puis-je en déduire que lorsque toutes les propriétés de la class sont initialisées, nous n'avons pas besoin de faire la manip "init()" à l'interieur de cette class?

                                Donc l'init sert uniquement lorsque certaines propriétées de la classe, ne sont pas encore initialisées, et auront besoin de l'être au moment de la création d'instance?

                                D'avance merci,

                                Aude

                                -
                                Edité par AudeChevalier1 18 janvier 2019 à 9:38:55

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  18 janvier 2019 à 10:46:10

                                  C’est exact. Ceci dit, rien n’empeche de créer un init pour override toute ou une partie de ces valeurs par défaut.

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    17 juillet 2019 à 16:22:44

                                    Bonjour, 

                                    J'ai un problème dans l'application quand j'appuie sur New Game, les questions ne chargent pas et reste bloqué à l'état "Loading".

                                    J'ai revu les cours et le code mais rien à faire.

                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      26 juillet 2019 à 14:38:38

                                      Bonjour, 

                                      J'ai un blocage dans le partie "Téléchargez les questions" dans l'exercice, question 4 voici l'intitulé :

                                      "Ensuite, nous allons créer une propriété (cette fois publique) currentQuestion de type Question qui contient la question à afficher à l'écran. Cette propriété est une propriété calculée en lecture seule qui renvoit l'élément à la position currentIndex dans notre tableau de questions."

                                      et voici mon code où je bloque :

                                      class Game {
                                        var score = 0
                                        var questions = [Question]()
                                        
                                        enum State {
                                          case ongoing, over
                                        }
                                        
                                        var state: State = .ongoing
                                        
                                        private var currentIndex = 0
                                        
                                        public var currentQuestion: Question {
                                          get {
                                            return
                                          }
                                        }
                                      }
                                      

                                      merci d'avance pour votre aide !

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        27 juillet 2019 à 14:20:56

                                        Salut,

                                        var currentQuestion: Question { return questions[currentIndex] } 
                                        

                                        Ceci dit, si currentIndex est supérieur au nombre de questions ça va crasher...

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          27 juillet 2019 à 14:51:34

                                          Merci pour ton retour aussi rapide qu'efficace !
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            31 juillet 2019 à 16:26:42

                                            Bonjour,

                                            Je suis actuellement dans la partie du cours où je dois connecter le contrôleur mais une erreur apparait dans Xcode et je ne sais pas de quoi il s'agit :

                                            " error: Build input file cannot be found: '/Users/Macbook/Desktop/OpenQuizz/OpenQuizz/Info.plist' "

                                            Je n'arrive pas à lancer le simulateur du coup.

                                            Merci pour votre aide ! 

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              31 juillet 2019 à 16:36:32

                                              Salut, il ne trouve pas le fichier Info.plist certainement tu as du le mettre dans un dossier, si c'est le cas remet le à sa position initial.
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                31 juillet 2019 à 18:15:24

                                                Merci beaucoup, je vais voir ça !
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  5 août 2019 à 22:43:56

                                                  Bonjour,

                                                  Pour la fin de ce cours qui est d'envoyer le code de l'application QuestionQuizz avec des modifications, je souhaitais arrondir les angles de vues Questions. Je suis tombé sur des forums où on me proposer des codes tel que : 

                                                  self.view.layer.cornerRadius = 20.0
                                                  self.view.clipToBounds = true


                                                  Mais je ne trouve pas la vue dans le ViewController pour effectuer cette action. Comment puis je faire svp ?

                                                  Loic

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    6 août 2019 à 9:56:02

                                                    Bonjour,

                                                    J'ai pas trop compris la question. Le code que tu as donné permet effectivement d'arrondir les angles.

                                                    Si tu l'utilises dans un ViewController tel quel, ça va arrondir les angles du viewcontroller

                                                    Si tu l'utilises dans un ViewController sur une vue il faut faire taVueAArrondir.layer

                                                    Si tu l'utilises dans une View ça ne va pas marcher (il faut enlever le .view)

                                                    Le mieux selon moi étant la 3è option, à savoir, le mettre dans ta QuestionView ou le nom que tu lui as donné.

                                                    -
                                                    Edité par Geda 6 août 2019 à 9:56:47

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      17 octobre 2019 à 11:08:40

                                                      Hello !

                                                      Je viens de commencé le cours sur le modèle MVC, j'ai une petite question au sujet de cette partie du cours.

                                                      Il y a cette fonction :

                                                      private func receiveQuestions(_ questions: [Question]) {
                                                          self.questions = questions
                                                          state = .ongoing
                                                      }

                                                      A quoi correspond le _ dans le paramètre de la fonction ?

                                                      Merci d'avance :)

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        17 octobre 2019 à 13:16:43

                                                        Tu Peux donner 2 noms Dans une signature. Le premier est utilisé lors de l’appel. Le second à l’utilisation.  Je suis sur téléphone donc le formatage est degueulasse mais dans l’idée ça donne ça :

                                                        func x(_ a: Int) { print(a) }


                                                        func y(a b: Int) { print(b) }


                                                        func z(a: Int) { print(a) }

                                                        x(3)

                                                        y(a: 3)

                                                        z(a: 3) 

                                                        -
                                                        Edité par Geda 17 octobre 2019 à 13:16:58

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter
                                                          17 octobre 2019 à 17:36:11

                                                          Donc si j'ai bien compris le _ dans ton exemple : 

                                                          func x(_ a: Int) { print(a) }
                                                          
                                                          

                                                          Permet de l'utiliser de cette façon :

                                                          x(3)

                                                          Mais si c'était :

                                                          func x(a: Int) { print(a) }
                                                          
                                                          

                                                          Ca donnerai :

                                                          x(a:3)

                                                          ?

                                                          ----------------------- 

                                                          J'ai une autre question en passant, j'en suis arrivé à cette partie.

                                                          Au niveau de la modification de UIImage, j'aimerai utilisé cette façon de faire : 

                                                          icon.image = nomDeMonImage

                                                          Il faut que mes images soit dans l'assets catalog, je vois pas du tout ou c'est à part si c'est Assets.xcassets.

                                                          Mais si c'est dedans mes images le sont déjà donc je comprend pas pourquoi j'ai pas la suggestion d'Xcode.





                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            17 octobre 2019 à 17:50:11

                                                            C’est exactement ça. 

                                                            c’est bien dans le dossier assets. C’est le nom de la ressource qu’il faut taper et non le nom de l’image (Ça peut être différent) 

                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              18 octobre 2019 à 10:15:42

                                                              D'accord donc mes images sont bien dans ce dossier mais dans le cours, Ambroise marque bien le nom de l'image comme ça :

                                                              icon.image = Icon Error

                                                              et il y a le petit icône de l'image devant, sauf que chez moi ça me le suggère pas et du coup ça ne la trouve pas.

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              MOOC Une application iPhone avec le modèle MVC

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown